《第九讲多线程优秀课件.ppt》由会员分享,可在线阅读,更多相关《第九讲多线程优秀课件.ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九讲多线程第1页,本讲稿共72页第九讲 JAVA多线程机制9.7 在同步方法中使用在同步方法中使用wait()、notify 和和notifyAll()方法方法9.8 挂起、恢复和终止线程挂起、恢复和终止线程9.9 计时器线程计时器线程Timer9.10 线程联合线程联合9.11 守护线程守护线程第2页,本讲稿共72页第九讲 JAVA多线程机制 教学目的:教学目的:学习学习java中线程的使用,掌握线程的调中线程的使用,掌握线程的调度和控制方法,清楚地理解多线程的互斥和度和控制方法,清楚地理解多线程的互斥和同步的实现原理,以及多线程的应用。掌握同步的实现原理,以及多线程的应用。掌握线程之间的
2、相互调度关系,尤其是通过线程线程之间的相互调度关系,尤其是通过线程睡眠来使其它线程获得执行机会的机制,以睡眠来使其它线程获得执行机会的机制,以及互斥和同步的实现机制。及互斥和同步的实现机制。第3页,本讲稿共72页第九讲 JAVA多线程机制 教学内容:教学内容:1.线程的基本概念;线程的基本概念;2.线程的状态与生命周期;线程的状态与生命周期;3.线程的创建;线程的创建;4.线程的调度与线程控制;线程的调度与线程控制;5.线程同步等相关内容。线程同步等相关内容。重点及难点重点及难点 1.多线程的调度和控制。多线程的调度和控制。2.多线程的互斥和同步。多线程的互斥和同步。第4页,本讲稿共72页9.
3、1 Java中的线程 一、程序、进程、线程简介一、程序、进程、线程简介 1、程序、程序:是用某种语言编写的是用某种语言编写的、完成特定任务的、完成特定任务的、一组指一组指令的集合。指一段静态的代码。令的集合。指一段静态的代码。2、进程、进程:进程是程序的一次动态执行过程,它对应了从代码加进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的执本身从产生、发展至消亡的过程。线程是比进程更小的执行单位行单位,一个进程在其执行过程中,可以产生多个线程,形一个进程
4、在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。生、存在和消亡的过程,也是一个动态的概念。第5页,本讲稿共72页 3、线线程程:是是进进程程中中的的一一个个实实体体,是是被被系系统统独独立立调调度度和和分分派派的的基基本本单单位位,线线程程自自己己基基本本不不拥拥有有系系统统资资源源,只只拥拥有有一一点点在在运运行行中中必必不不可可少少的的资资源源(如如:程程序序计计数数器器,一一组组寄寄存存器器和和栈)栈)执行执行就绪就绪等待等待CPU挂起挂起第6页,本讲稿共72
5、页9.1 Java中的线程4、进程与线程的区别、进程与线程的区别1)线程的划分尺度小于进程)线程的划分尺度小于进程。2)多个线程是共享内存单元的,而进程在执)多个线程是共享内存单元的,而进程在执行过程中拥有自己独立的内存单元。行过程中拥有自己独立的内存单元。3)线程自己基本不拥有系统资源,只拥有一线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源,而进程要运行点在运行中必不可少的资源,而进程要运行必须获得有可能需要的所有资源必须获得有可能需要的所有资源。第7页,本讲稿共72页9.1 Java中的线程5、线程的调度方法、线程的调度方法1)调度策略调度策略时间片时间片轮转式轮转式抢占式:
6、高优先级的线程抢占抢占式:高优先级的线程抢占CPU 2)Java的调度方法的调度方法对高优先级,使用优先调度的抢占式策略。对高优先级,使用优先调度的抢占式策略。同优先级线程,使用时间片策略。同优先级线程,使用时间片策略。12第8页,本讲稿共72页9.1 Java中的线程 二、线程的状态与生命周期二、线程的状态与生命周期 要想实现线程,必须在主线程中创建要想实现线程,必须在主线程中创建新的线程对象新的线程对象,在线程的一个完整的生命在线程的一个完整的生命周期中通常要经历如下的五种状态周期中通常要经历如下的五种状态:1、新建:、新建:当当一个线程刚创建时的状态。一个线程刚创建时的状态。2、就绪:处
7、于、就绪:处于新建新建状态的线程被启动后状态的线程被启动后的状态。的状态。第9页,本讲稿共72页9.1 Java中的线程 3、运行:当就绪的线程被调度并获得运行:当就绪的线程被调度并获得CPU时的状态。时的状态。4、阻塞:在某种特殊情况下,被人为挂阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出起或执行输入输出操作时,让出CPU临临时中止自己的执行,进入的状态。时中止自己的执行,进入的状态。5、死亡:线程完成了它的全部工作自动、死亡:线程完成了它的全部工作自动终止或线程被提前强制性地中止的状态。终止或线程被提前强制性地中止的状态。(stop()或或destroy())第10页,本讲
8、稿共72页线程的生命周期图线程的生命周期图第11页,本讲稿共72页线程的状态转移图线程的状态转移图CPU调度 I/O完成sleep时间到新建状态新建状态new Thread(.)就绪状态就绪状态start()等待状态等待状态执行状态执行状态I/Osleep()run()结束stop()yield()消亡消亡第12页,本讲稿共72页9.1 Java中的线程 三、启动线程三、启动线程 线程创建后仅仅是占有了内存资源,在线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程管理的线程中还没有这个线程,此线程必须调用必须调用start()方法(从父类继承的方法)()方法(从父类继承
9、的方法)通知通知JVM,这样,这样JVM就会知道又有一个新一就会知道又有一个新一个线程排队等候切换了。个线程排队等候切换了。第13页,本讲稿共72页例9.1public 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=6;i+)System.out.println(我是主线程我是主线程);第14
10、页,本讲稿共72页class Lefthand extends Thread public void run()for(int i=1;i=9;i+)System.out.println(我是左手线程);第15页,本讲稿共72页class Righthand extends Thread public void run()for(int i=1;i=9;i+)System.out.println(我是右手线程);第16页,本讲稿共72页9.2 Java中线程的实现 Java的线程是通过的线程是通过java.lang.Thread类类来实现的。当我们生成一个来实现的。当我们生成一个Thread类
11、的对象类的对象之后之后,一个新的线程就产生了。而每个线程都一个新的线程就产生了。而每个线程都是通过类是通过类Thread(在(在Java的软件包的软件包Java.lang中定义)的构造方法创建的。构中定义)的构造方法创建的。构造方法如下:造方法如下:public Thread(ThreadGroup group,Runnable target,String name););第17页,本讲稿共72页9.2 Java中线程的实现 当上述构造方法的某个参数为当上述构造方法的某个参数为null时,我们可得时,我们可得到下面的几个构造方法:到下面的几个构造方法:vpublic Thread();();v
12、public Thread(Runnable target););vpublic Thread(Runnable target,String name););vpublic Thread(String name););vpublic Thread(ThreadGroup group,Runnable target););vpublic Thread(ThreadGroup group,String name););第18页,本讲稿共72页9.2 Java中线程的实现 一、线程的创建方法一、线程的创建方法(一)(一)Thread的子类创建线程的子类创建线程 1)定义一个线程类,它继承线程类)定义
13、一个线程类,它继承线程类Thread 2)重写其中的方法)重写其中的方法run()。这时在初始化这个类的实例时,目标这时在初始化这个类的实例时,目标target可为可为null,表示由这个实例对象来执行线程,表示由这个实例对象来执行线程体。体。第19页,本讲稿共72页9.2 Java中线程的实现3)方法说明:)方法说明:v编写编写Thread类的子类时,需要重写父类的类的子类时,需要重写父类的run方法,其目的是规定线程的具体操作,否方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的则线程就什么也不做,因为父类的run方法中方法中没有任何操作语句。没有任何操作语句。v当当JVM
14、将将CPU使用权切换给线程时,如果线使用权切换给线程时,如果线程是程是Thread的子类创建的,该类中的的子类创建的,该类中的run方方法就立刻执行。法就立刻执行。第20页,本讲稿共72页例9.2public class Example9_2 public static void main(String args)People teacher,student;ComputerSum sum=new ComputerSum();teacher=new People(老师老师,200,sum);student=new People(学生学生,200,sum);teacher.start();stu
15、dent.start();第21页,本讲稿共72页class ComputerSum int sum;public void setSum(int n)sum=n;public int getSum()return sum;第22页,本讲稿共72页class People extends Thread int timeLength;/线程休眠的时间长度 ComputerSum sum;People(String s,int timeLength,ComputerSum sum)setName(s);/调用Thread类的方法 setName为线程起个名字 this.timeLength=tim
16、eLength;this.sum=sum;第23页,本讲稿共72页public void run()for(int i=1;i=5;i+)int m=sum.getSum();sum.setSum(m+1);System.out.println(“我是我是”+getName()+“,现现 在的和在的和:+sum.getSum();try sleep(timeLength);catch(InterruptedException e)第24页,本讲稿共72页9.2 Java中线程的实现(二)(二)使用Runable接口 1)定义一个类,实现)定义一个类,实现Runnable接口,并接口,并over
17、ride run()方法,而方法,而run()中是你希望这中是你希望这个线程运行的代码;个线程运行的代码;2)创建这个新类的对象;)创建这个新类的对象;3)创建一个)创建一个Thread类的对象,用刚才的类的对象,用刚才的Runnable对象作为构造函数的参数;对象作为构造函数的参数;4)调用)调用Thread 对象的对象的start()方法来启动线方法来启动线程。程。第25页,本讲稿共72页9.2 Java中线程的实现5)方法说明)方法说明v创建线程的另一个途径就是用创建线程的另一个途径就是用Thread类直接创建线程对类直接创建线程对象。使用象。使用Thread创建线程对象时,通常使用的构
18、造方法创建线程对象时,通常使用的构造方法是:是:v Thread(Runnable target)v该构造方法中的参数是一个该构造方法中的参数是一个Runnable类型的接口,因此,类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实在创建线程对象时必须向构造方法的参数传递一个实现现Runnable接口类的实例,该实例对象称作所创线程的目接口类的实例,该实例对象称作所创线程的目标对象。标对象。v当线程调用当线程调用start方法后,一旦轮到它来享用方法后,一旦轮到它来享用CPU资资源,目标对象就会自动调用接口中的源,目标对象就会自动调用接口中的run方法(接口方法(接口回调)。回调
19、)。v 第26页,本讲稿共72页例9.3public class Example9_3 public static void main(String args)Bank bank=new Bank();/线程的目标对象设置被线程共享的线程的目标对象设置被线程共享的money bank.setMoney(300);bank.会计会计.start();bank.出纳出纳.start();第27页,本讲稿共72页class Bank implements Runnable private int money=0;Thread 会计会计,出纳出纳;Bank()会计会计=new Thread(this)
20、;会计会计.setName(会计会计);出纳出纳=new Thread(this);/会计和出纳的目标对象相同会计和出纳的目标对象相同 出纳出纳.setName(出纳出纳);public void setMoney(int mount)money=mount;第28页,本讲稿共72页public void run()/接口中的方法接口中的方法 while(true)money=money-50;if(Thread.currentThread()=会计会计)System.out.println(“我是我是”+会计会计.getName()+现在有现在有:+money+元元);if(money=15
21、0)System.out.println(会计会计.getName()+进入死亡状态进入死亡状态);return;/如果如果money少于少于50,会计的会计的run方法结束方法结束 第29页,本讲稿共72页else if(Thread.currentThread()=出纳出纳)System.out.println(我是我是+出纳出纳.getName()+现在有现在有:+money+元元);if(money=12)return;第37页,本讲稿共72页9.4线程的常用方法 5、currentThread()currentThread()方法是()方法是Thread类中类中的类方法,可以用类名调
22、用,该方法返回的类方法,可以用类名调用,该方法返回当前正在使用当前正在使用CPU资源的线程。资源的线程。6、interrupt()intertupt方法经常用来方法经常用来“吵醒吵醒”休眠的休眠的线程。当一些线程调用线程。当一些线程调用sleep方法处于休眠方法处于休眠状态时,一个占有状态时,一个占有CPU资源的线程可以让资源的线程可以让休眠的线程调用休眠的线程调用interrupt 方法方法“吵醒吵醒”自自己。己。第38页,本讲稿共72页例9.9public class Example9_9 public static void main(String args)A a=new A();a.
23、student.start();a.teacher.start();第39页,本讲稿共72页class A implements Runnable Thread student,teacher;A()teacher=new Thread(this);student=new Thread(this);teacher.setName(王教授);student.setName(张三);第40页,本讲稿共72页public void run()if(Thread.currentThread()=student)try System.out.println(student.getName()+正在睡觉,
24、不听课正在睡觉,不听课);Thread.sleep(1000*60*60);catch(InterruptedException e)System.out.println(student.getName()+被老师叫醒了被老师叫醒了);System.out.println(student.getName()+开始听课开始听课);第41页,本讲稿共72页else if(Thread.currentThread()=teacher)for(int i=1;i=3;i+)System.out.println(上课上课!);try Thread.sleep(500);catch(Interrupted
25、Exception e)student.interrupt();/吵醒吵醒student 第42页,本讲稿共72页9.5 GUI线程 程序包含图形用户界面(程序包含图形用户界面(GUI)时,)时,Java虚拟机在运行应用程序时会自动启动更虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:多的线程,其中有两个重要的线程:AWT-EventQuecue和和AWT-Windows。AWT-EventQuecue-()线程负责处理线程负责处理GUI事件,事件,AWT-Windows线程负责将窗体或组件绘制线程负责将窗体或组件绘制到桌面。到桌面。第43页,本讲稿共72页9.6线程同步 一
26、、线程同步问题一、线程同步问题线程同步是指几个线程都需要调用一个同步方法线程同步是指几个线程都需要调用一个同步方法(使用关键字使用关键字synchronized修饰的方法修饰的方法)。前面所提到的线程都是独立的,而且异步执行,也就是前面所提到的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状
27、态和行为,否则就不能保证程序的运行考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。结果的正确性。第44页,本讲稿共72页9.6线程同步 二、同步机制二、同步机制 当一个线程当一个线程A使用一个使用一个synchronized修修饰的方法时,其他线程想使用这个方法时就饰的方法时,其他线程想使用这个方法时就必须等待,直到线程必须等待,直到线程A 使用完该方法使用完该方法(除非(除非线程线程A使用使用wait主动让出主动让出CPU资源)。资源)。格式格式1:synchronized 方法名方法名 格式格式2:方法名方法名 synchronized(this).第45页,本讲稿共72页
28、例9.13 public synchronized void 存取存取(int number)/存取方法存取方法 if(Thread.currentThread()=会计会计)text1.append(今天是星期今天是星期+weekDay+n);for(int i=1;i=3;i+)/会计使用存取方法存入会计使用存取方法存入90元,存入元,存入30元,稍歇一下元,稍歇一下 money=money+number;/这时出纳仍不能使用存取方法这时出纳仍不能使用存取方法 try Thread.sleep(1000);/因为会计还没使用完存取方法因为会计还没使用完存取方法 catch(Interrup
29、tedException e)text1.append(帐上有帐上有+money+万万n);第46页,本讲稿共72页 else if(Thread.currentThread()=出纳出纳)text2.append(今天是星期今天是星期+weekDay+n);for(int i=1;i=2;i+)/出纳使用存取方法取出纳使用存取方法取 /出出30元,取出元,取出15元,稍歇一下元,稍歇一下 money=money-number/2;/这时会计仍不能使用存取方法这时会计仍不能使用存取方法 try Thread.sleep(1000);/因为出纳还没使用完存取方法因为出纳还没使用完存取方法 cat
30、ch(InterruptedException e)text2.append(帐上有帐上有+money+万万n);第47页,本讲稿共72页public void run()if(Thread.currentThread()=会计会计|Thread.currentThread()=出纳出纳)for(int i=1;i=3;i+)/从周一到周三会计从周一到周三会计 /和出纳都要使用帐本和出纳都要使用帐本 weekDay=i;存取存取(30);第48页,本讲稿共72页9.7在同步方法中使用wait()、notify 和notifyAll()方法 wait()与与notify()是是Object类的方
31、法类的方法它们的定义为:它们的定义为:public final void1.wait():令当前线程挂起并放弃管程,同步资源:令当前线程挂起并放弃管程,同步资源解锁,使别的线程可访问并修改共享资源,而解锁,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问当前线程排队等候再次对资源的访问2.notify():唤醒正在排队等待资源管程的线程中唤醒正在排队等待资源管程的线程中优先级最高者,使之执行并拥有资源的管程。优先级最高者,使之执行并拥有资源的管程。第49页,本讲稿共72页9.7在同步方法中使用wait()、notify 和notifyAll()方法 一个线程在使用的同步方法中
32、时,可能根一个线程在使用的同步方法中时,可能根据问题的需要,必须使用据问题的需要,必须使用wait()方法使本线程方法使本线程等待,暂时让出等待,暂时让出CPU的使用权,并允许其它线的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这程使用这个同步方法。其它线程如果在使用这个同步方法时如果不需要等待,那么它用完这个同步方法时如果不需要等待,那么它用完这个同步方法的同时,应当执行个同步方法的同时,应当执行notifyAll()方法方法通知所有的由于使用这个同步方法而处于等待通知所有的由于使用这个同步方法而处于等待的线程结束等待。的线程结束等待。第50页,本讲稿共72页9.7在同步方法中
33、使用wait()、notify 和notifyAll()方法1 1)public final void wait()方法方法v在当前线程中调用方法:在当前线程中调用方法:对象名对象名.wait()v使当前线程进入等待(某对象)状态使当前线程进入等待(某对象)状态,直到另一线程对该,直到另一线程对该对象发出对象发出notify(或或notifyAll)为止。为止。v调用方法的必要条件:当前线程必须具有对该对象的监控权调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)(加锁)v当前线程将释放对象监控权当前线程将释放对象监控权 ,然后进入等待队列,然后进入等待队列(wait队列)。队列)。
34、v在当前线程被在当前线程被notify后,要重新获得监控权,然后从断后,要重新获得监控权,然后从断点处继续代码的执行。点处继续代码的执行。第51页,本讲稿共72页9.7在同步方法中使用wait()、notify 和notifyAll()方法2)public final void notify()方法方法v在当前线程中调用方法:在当前线程中调用方法:对象名对象名.notify()v功能:唤醒等待该对象监控权的一个线程。功能:唤醒等待该对象监控权的一个线程。v调用方法的必要条件:当前线程必须具有对调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)。该对象的监控权(加锁)。第52页,本讲稿
35、共72页例9.14Thread 张平,李明;public void actionPerformed(ActionEvent e)try 张平.start();李明.start();catch(Exception exp)第53页,本讲稿共72页public void run()if(Thread.currentThread()=张平张平)王小姐王小姐.售票规则售票规则(20);else if(Thread.currentThread()=李明李明)王小姐王小姐.售票规则售票规则(5);第54页,本讲稿共72页class 售票员售票员 int 五元钱的个数五元钱的个数=2,十元钱的个数十元钱的个
36、数=0,二十元钱的个数二十元钱的个数=0;String s=null;public synchronized void 售票规则售票规则(int money)if(money=5)/如果使用该方法的线程传递的参数是如果使用该方法的线程传递的参数是5,就不用等待就不用等待 五元钱的个数五元钱的个数=五元钱的个数五元钱的个数+1;s=给您入场卷您的钱正好给您入场卷您的钱正好;MyFrame.text.append(n+s);第55页,本讲稿共72页else if(money=20)while(五元钱的个数五元钱的个数3)try wait();/如果使用该方法的线程传递的参数是如果使用该方法的线程传
37、递的参数是20须等待须等待 catch(InterruptedException e)五元钱的个数五元钱的个数=五元钱的个数五元钱的个数-3;二十元钱的个数二十元钱的个数=二十元钱的个数二十元钱的个数+1;s=给您入场卷给您入场卷+您给我您给我20,找您,找您15元元;MyFrame.text.append(n+s);notifyAll();第56页,本讲稿共72页9.8挂起、恢复和终止线程 1、挂起、挂起 程序运行时,有时候两个线程并不是同步的,即不涉及程序运行时,有时候两个线程并不是同步的,即不涉及都需要调用一个同步方法,但线程也可能需要暂时的挂起。都需要调用一个同步方法,但线程也可能需要
38、暂时的挂起。所谓挂起一个线程就是让线程暂时让出所谓挂起一个线程就是让线程暂时让出CPU的使用权限,的使用权限,暂时停止执行,但停止执行的持续时间不确定,因此暂时停止执行,但停止执行的持续时间不确定,因此不能使用不能使用sleep方法暂停线程。挂起一个线程需使用方法暂停线程。挂起一个线程需使用wait方法,即让准备挂起的线程调用方法,即让准备挂起的线程调用 wait 方法,主动让方法,主动让出出CPU的使用权限。的使用权限。第57页,本讲稿共72页9.8挂起、恢复和终止线程 2、恢复、恢复 为了恢复某个线程,其它线程在占有为了恢复某个线程,其它线程在占有CUP资源期间,让挂起的线程的目标对象执资
39、源期间,让挂起的线程的目标对象执行行notifyAll()方法,使得挂起的线程继续执方法,使得挂起的线程继续执行;如果线程没有目标对象,为了恢复该线行;如果线程没有目标对象,为了恢复该线程,其它线程在占有程,其它线程在占有CPU资源期间,让挂起资源期间,让挂起的线程调用的线程调用notifyAll()方法,使挂起的线程方法,使挂起的线程继续执行。继续执行。第58页,本讲稿共72页9.8挂起、恢复和终止线程 3、终止线程、终止线程1)线程执行完其线程执行完其run()方法后,会自然终止。方法后,会自然终止。2)通过调用线程的实例方法通过调用线程的实例方法stop()来终止线来终止线程。程。第59
40、页,本讲稿共72页9.9计时器线程Timer使用使用Timer类的构造方法:类的构造方法:Timer(int a,Object b)创创建一个计时器。建一个计时器。参数参数a的单位是豪秒,确定计时器每隔的单位是豪秒,确定计时器每隔a 毫秒毫秒“震铃震铃”一次,参数一次,参数b是计时器的监视器。计时器发生的震铃事是计时器的监视器。计时器发生的震铃事件是件是ActinEvent 类型事件。类型事件。当震铃事件发生时,监视器就会监视到这个事件,就会当震铃事件发生时,监视器就会监视到这个事件,就会执行接口执行接口ActionListener中的方法中的方法:actionPerformed(Action
41、event e)。使用使用Timer类的类的start()方法启动计时器,即启动线程。方法启动计时器,即启动线程。使用使用stop()方法停止计时器,即挂起线程,使用方法停止计时器,即挂起线程,使用restart()方法重新启动计时器,即恢复线程。方法重新启动计时器,即恢复线程。第60页,本讲稿共72页例9.18vimport javax.swing.Timer;vTimer time;vtime=new Timer(1000,this);/TimeWin对象做计时器的监视器 第61页,本讲稿共72页public void actionPerformed(ActionEvent e)if(e.
42、getSource()=time)java.util.Date date=new java.util.Date();String str=date.toString().substring(11,19);text.setText(时间:时间:+str);int x=text.getBounds().x;int y=text.getBounds().y;y=y+2;text.setLocation(x,y);第62页,本讲稿共72页 else if(e.getSource()=bStart)time.start();else if(e.getSource()=bStop)time.stop();
43、else if(e.getSource()=bContinue)time.restart();第63页,本讲稿共72页9.10线程联合一个线程一个线程A在占有在占有CPU资源期间,可以让其资源期间,可以让其它线程调用它线程调用join()和本线程联合()和本线程联合.如果线程如果线程A在占有在占有CPU资源期间一旦联合资源期间一旦联合B线线程,那么程,那么A线程将立刻中断执行,一直等到它线程将立刻中断执行,一直等到它联合的线程联合的线程B执行完毕,执行完毕,A线程再重新排队等线程再重新排队等待待CPU资源,以便恢复执行。资源,以便恢复执行。第64页,本讲稿共72页9.10线程联合 当前线程等待
44、调用该方法的线程结束后当前线程等待调用该方法的线程结束后,再再恢复执行。恢复执行。MyThread tt=new MyThread(100);tt.start();public void timeout()tt.join();/当前线程等待线程当前线程等待线程tt /执行完后再继续往下执行执行完后再继续往下执行 第65页,本讲稿共72页例9.19public class Example9_19 public static void main(String args)ThreadJoin a=new ThreadJoin();a.customer.start();a.tvMaker.start(
45、);第66页,本讲稿共72页class ThreadJoin implements Runnable TV tv;Thread customer,tvMaker;ThreadJoin()customer=new Thread(this);tvMaker=new Thread(this);customer.setName(顾客);tvMaker.setName(电视制造厂);第67页,本讲稿共72页public void run()if(Thread.currentThread()=customer)System.out.println(customer.getName()+等等+tvMaker
46、.getName()+生产电视生产电视);try tvMaker.join();/线程线程customer开始等待开始等待tvMaker结束结束 catch(InterruptedException e)System.out.println(customer.getName()+买了一台电视:买了一台电视:+tv.name+价钱价钱:+tv.price);第68页,本讲稿共72页else if(Thread.currentThread()=tvMaker)System.out.println(tvMaker.getName()+“开始生产电视开始生产电视,请等请等.);try tvMaker.
47、sleep(2000);catch(InterruptedException e)tv=new TV(红星牌红星牌,3288);System.out.println(tvMaker.getName()+生产完毕生产完毕);第69页,本讲稿共72页class TV float price;String name;TV(String name,float price)this.name=name;this.price=price;第70页,本讲稿共72页9.11守护线程程序中的所有用户线程都已结束运行时,即程序中的所有用户线程都已结束运行时,即使守护线程的使守护线程的run方法中还有需要执行的语方法中还有需要执行的语句,守护线程也立刻结束运行。我们可以用句,守护线程也立刻结束运行。我们可以用守护线程做一些不是很严格的工作,线程的守护线程做一些不是很严格的工作,线程的随时结束不会产生什么不良的后果。随时结束不会产生什么不良的后果。一个线程调用一个线程调用 void setDaemon(boolean on)方法可以将自己设置成一个守护方法可以将自己设置成一个守护(Daemon)线程)线程,线程必须在运行之前设置线程必须在运行之前设置自己是否是守护线程。自己是否是守护线程。第71页,本讲稿共72页课后习题:课后习题:P261 3,13第72页,本讲稿共72页
限制150内