语言程序设计第三版清华第8章幻灯片

上传人:bin****86 文档编号:54986301 上传时间:2018-09-23 格式:PPT 页数:67 大小:975KB
返回 下载 相关 举报
语言程序设计第三版清华第8章幻灯片_第1页
第1页 / 共67页
语言程序设计第三版清华第8章幻灯片_第2页
第2页 / 共67页
语言程序设计第三版清华第8章幻灯片_第3页
第3页 / 共67页
语言程序设计第三版清华第8章幻灯片_第4页
第4页 / 共67页
语言程序设计第三版清华第8章幻灯片_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《语言程序设计第三版清华第8章幻灯片》由会员分享,可在线阅读,更多相关《语言程序设计第三版清华第8章幻灯片(67页珍藏版)》请在金锄头文库上搜索。

1、第九章 线程,2,目录,Java中的线程 线程的生命周期 Thread的子类创建线程 使用Runable接口 线程的常用方法 线程的优先级 线程同步 在同步方法中使用wait()、notify 和notifyAll()方法 挂起、恢复和终止线程 本章小结,3,线程的概念,进程和线程的区别(Example9_11) 进程 一个独立程序的每一次运行称为一个进程,例如 用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 设置一个进程要占用相当一部分处理器时间和内存资源 大多数操作系统不允许进程访问其他进程的内存空间,进程间的通信很不方便,编程模型比较复杂,

2、进程通信方式共享存储器系统、消息传到机制、管道通信,4,线程 一个程序中多段代码同时并发执行,称为多线程 通过多线程,一个进程表面上看同时可以执行一个以上的任务并发 创建线程比创建进程开销要小得多,线程之间的协作和数据交换也比较容易(进程独站资源) 线程间共享资源(内存、代码、数据)有利于并行处理,线程的概念(续),5,线程的状态与生命周期,新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存空间和其他资源。 就绪状态:线程等待 CPU 运行状态:start()方法开始执行 中断(阻塞)状态:sleep(), wait(), I/O 完

3、成 or 发布 I/O 请求 sleep(): 使当前线程进入等待状态,参数设定其等待时间 wait(): 使当前线程进入等待状态,调用nofify(), or notifyAll(), 使其重新进入线程等待队列 死亡: run() 方法完成 stop() 方法被调用,6,Life Cycle of Thread,7,诞生状态 线程刚刚被创建 就绪状态 线程的 start 方法已被执行 线程已准备好运行 运行状态 处理机分配给了线程,线程正在运行 阻塞状态(Blocked) 在线程发出输入/输出请求且必须等待其返回 遇到用synchronized标记的方法而未获得其监视器暂时不能进入执行时 休

4、眠状态(Sleeping) 执行sleep方法而进入休眠 死亡状态 线程已完成或退出,线程的几种基本状态(续),8,主线程:Java应用程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法之后,启动的线程称作“主线程”,该线程负责执行main方法。 在main方法的执行中再创建的线程,就称为程序中的其它线程。 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会结束Java应用程序。 如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,main方法即使执行完最后的语句,JVM也不会结束程序,JVM一直要等到程序

5、中的所有线程都结束之后,才结束Java应用程序。,9,Java中创建线程的两种方法 Thread 类的子类创建线程对象,子类重写Thread类中的run()方法 使用Thread类直接创建线程对象,但需要使用Runable接口,10,Thread类,Thread类 在Java程序中创建多线程的方法之一是继承Thread类 封装了Java程序中一个线程对象需要拥有的属性和方法 从Thread类派生一个子类,并创建这个子类的对象,就可以产生一个新的线程。这个子类应该重写Thread类的run()方法,在run方法中写入需要在新线程中执行的语句段。这个子类的对象需要调用start方法来启动,新线程将

6、自动进入run方法。原线程将同时继续往下执行 它位于java.lang包中,因而程序开头不用import任何包就可直接使用 例子:Example9_1.java,public class Example9_1 public static void main(String args) Lefthand left;Righthand right; left=new Lefthand() ; /创建线程right=new Righthand();left.start(); right.start();for(int i=1;i=3;i+) System.out.println(“我是主线程“); ,

7、class Lefthand extends Thread public void run() for(int i=1;i=3;i+) System.out.println(“我是左手线程“); class Righthand extends Thread public void run() for(int i=1;i0) result=result*i;i=i-1;System.out.println(“The factorial of “+num+“ is “+result); System.out.println(“new thread ends“); 运行结果 main thread

8、starts main thread ends new thread started The factorial of 10 is 3628800 new thread ends,Thread类(续),14,结果说明 main线程已经执行完后,新线程才执行完 main函数调用thread.start()方法启动新线程后并不等待其run方法返回就继续运行(执行System.out.println(),thread.run函数在一边独自运行,不影响原来的main函数的运行 源程序修改 如果启动新线程后希望主线程多持续一会再结束,可在start语句后加上让当前线程(main)休息1毫秒的语句: tr

9、y Thread.sleep(1); catch(Exception e);,Thread类(续),15,修改后运行结果 main thread starts new thread stared The factorial of 10 is 3628800 new thread ends main thread ends 运行结果说明 新线程结束后main线程才结束 例子 Ex8_1.java,Thread类(续) 例8_1修改后运行结果,16,Thread类(续) 常用API函数,17,Thread类(续) 常用API函数,18,Thread类(续) 常用API函数,19,创建3个新线程,每

10、个线程睡眠一段时间(06秒),然后结束 public class Ex8_2 public static void main( String args ) /创建并命名每个线程TestThread thread1 = new TestThread( “thread1“ );TestThread thread2 = new TestThread( “thread2“ );TestThread thread3 = new TestThread( “thread3“ ); System.out.println( “Starting threads“ ); thread1.start(); / 启动线

11、程1thread2.start(); / 启动线程2thread3.start(); / 启动线程3 System.out.println( “Threads started, main endsn“ ); ,Thread类(续) 例8_2,20,class TestThread extends Thread private int sleepTime; public TestThread( String name ) super( name ); /调用父类构造函数为线程命名sleepTime = ( int ) ( Math.random() * 6000 ); public void r

12、un() try System.out.println( getName() + “ going to sleep for “ + sleepTime ); Thread.sleep( sleepTime ); /线程休眠 catch ( InterruptedException exception ) ;System.out.println( getName() + “ finished“ ,Thread类(续) 例8_2,21,运行结果 Starting threads Threads started, main endsthread1 going to sleep for 3519 th

13、read2 going to sleep for 1689 thread3 going to sleep for 5565 thread2 finished thread1 finished thread3 finished 说明 由于线程3休眠时间最长,所以最后结束,线程2休眠时间最短,所以最先结束 每次运行,都会产生不同的随机休眠时间,所以结果都不相同,Thread类(续) 例8_2运行结果,22,Runnable接口,Runnable接口 在编写复杂程序时相关的类可能已经继承了某个基类,而Java不支持多继承,在这种情况下,便需要通过实现Runnable接口来生成多线 使用Thread创

14、建线程对象时,通常使用的构造方法是:Thread(Runnable target)该构造方法中的参数是一个Runnable类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象. 当线程调用start方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run方法(接口回调). 对于使用同一目标对象的线程,目标对象的成员变量自然就是这些线程的共享数据单元 不同run()方法中的局部变量互不干扰。 修改Ex8_1.java例子:workspace/ThreadDemo2_2.java(java2006/example9/ThreadDemo1_1,ThreadDemo2_2) 例子:Example9_3.java,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号