《Java语言实用教程第10章.ppt》由会员分享,可在线阅读,更多相关《Java语言实用教程第10章.ppt(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第10章章 多线程机制多线程机制10.1 多线程的概念多线程的概念10.2 创建线程创建线程10.3 线程的优先级线程的优先级10.4 线程的控制线程的控制10.5 线程的同步机制与共享资源线程的同步机制与共享资源10.6 何时使用多线程及注意问题何时使用多线程及注意问题习题习题程程序序(program)是是对对数数据据描描述述与与操操作作的的代代码码的的集集合合,是应用程序执行的脚本。是应用程序执行的脚本。进进程程(process)是是程程序序的的一一次次执执行行过过程程,是是操操作作系系统统运运行行程程序序的的基基本本单单位位。程程序序是是静静态态的的,进进程程是是动动态态的的。系系统统
2、运运行行一一个个程程序序就就是是一一个个进进程程从从创创建建、运运行行到到消亡的过程。消亡的过程。系系统统可可以以为为一一个个程程序序同同时时创创建建多多个个进进程程。每每一一个个进进程程都都有有自自己己独独立立的的一一块块内内存存空空间间和和一一组组系系统统资资源源,即即使使同类进程之间也不会共享系统资源。同类进程之间也不会共享系统资源。10.1 多线程的概念多线程的概念 10.1.1 程序、进程和多任务程序、进程和多任务 多多任任务务是是指指在在一一个个系系统统中中可可以以同同时时运运行行多多个个程程序序,即即有多个独立运行的任务,每一个任务对应一个进程。有多个独立运行的任务,每一个任务对
3、应一个进程。由于一个由于一个CPU在同一时刻只能执行一个程序中的一条在同一时刻只能执行一个程序中的一条指令。实际上,多任务运行的并发机制使这些任务交指令。实际上,多任务运行的并发机制使这些任务交替运行,因间隔时间短,所以感觉就是多个程序在同替运行,因间隔时间短,所以感觉就是多个程序在同时运行。时运行。运运行行一一个个程程序序时时,程程序序内内部部的的代代码码都都是是按按顺顺序序先先后后执执行行的的。如如果果能能够够将将一一个个进进程程划划分分为为更更小小的的运运行行单单位位,则则程程序序中中一一些些彼彼此此相相对对独独立立的的代代码码段段可可以以重重叠叠运运行行,将会获得更高的执行效率。线程就
4、是解决这个问题的。将会获得更高的执行效率。线程就是解决这个问题的。线线程程是是比比进进程程更更小小的的运运行行单单位位,是是程程序序中中单单个个顺顺序序的的流控制。一个进程中可以包含多个线程。流控制。一个进程中可以包含多个线程。线线程程是是一一种种特特殊殊的的多多任任务务方方式式。当当一一个个程程序序执执行行多多线线程程时时,可可以以运运行行两两个个或或更更多多的的由由同同一一个个程程序序启启动动的的任任务。这样,一个程序可以使得多个活动任务同时发生。务。这样,一个程序可以使得多个活动任务同时发生。10.1.2 线程线程 线程与任何一个程序一样有一个开始、一系列可执行线程与任何一个程序一样有一
5、个开始、一系列可执行的命令序列、一个结束。在执行的任何时刻,只有一的命令序列、一个结束。在执行的任何时刻,只有一个执行点。线程与程序不同的是线程本身不能运行,个执行点。线程与程序不同的是线程本身不能运行,它只能包含在程序中,只能在程序中执行。一个线程它只能包含在程序中,只能在程序中执行。一个线程在程序运行时,必须争取到为自己分配的系统资源,在程序运行时,必须争取到为自己分配的系统资源,如执行堆栈、程序计数器,等等。如执行堆栈、程序计数器,等等。多多线线程程是是相相对对于于单单线线程程而而言言的的,指指的的是是在在一一个个程程序序中中可可以以定定义义多多个个线线程程并并同同时时运运行行它它们们,
6、每每个个线线程程可可以以执执行行不不同同的的任任务务。与与进进程程不不同同的的是是,同同类类多多线线程程共共享享一一块块内内存存空空间间和和一一组组系系统统资资源源,所所以以,系系统统创创建建多多线线程程开销相对较小。因此,也称线程为轻负荷进程。开销相对较小。因此,也称线程为轻负荷进程。多线程和多任务是两个既有联系又有区别的概念。多多线程和多任务是两个既有联系又有区别的概念。多任务是针对操作系统而言的,代表着操作系统可以同任务是针对操作系统而言的,代表着操作系统可以同时执行的程序个数;多线程是针对一个程序而言的,时执行的程序个数;多线程是针对一个程序而言的,代表着一个程序内部可以同时执行的线程
7、个数,而每代表着一个程序内部可以同时执行的线程个数,而每个线程可以完成不同的任务。个线程可以完成不同的任务。10.1.3 多线程多线程 1.线程的生命周期与状态线程的生命周期与状态 一一个个线线程程也也有有从从创创建建、运运行行到到消消亡亡的的过过程程,称称为为线线程程的的生生命命周周期期。使使用用线线程程的的状状态态表表明明线线程程处处于于生生命命周周期期的的 哪哪 个个 阶阶 段段。线线 程程 有有 创创 建建(New)、可可 运运 行行(Runnable)、运运行行中中(Running)、挂挂起起(Not Runnable)、死死亡亡(Dead)5种种状状态态。通通过过线线程程的的控控制
8、和调度可使线程在这几种状态间转化。制和调度可使线程在这几种状态间转化。Java语言内在支持多线程,所有的类都是在多线程思语言内在支持多线程,所有的类都是在多线程思想下定义的。想下定义的。Java的每个程序自动拥有一个线程,称的每个程序自动拥有一个线程,称为主线程。当程序加载到内存时,启动主线程。要加为主线程。当程序加载到内存时,启动主线程。要加载其他线程,程序就要使用载其他线程,程序就要使用Thread类(专门用来创类(专门用来创建和控制线程的类)或建和控制线程的类)或Runnable接口。接口。10.1.4 线程的生命周期与线程的生命周期与Java的多线程机制的多线程机制 2.Java的多线
9、程机制的多线程机制java.lang中中的的线线程程类类Thread封封装装了了所所有有需需要要的的线线程程操操作作控控制制,有有很很多多方方法法用用来来控控制制一一个个线线程程的的运运行行、休休眠眠、挂起或停止。这就是挂起或停止。这就是Java的多线程机制。的多线程机制。使用使用Java的多线程机制编程可将程序的任务分解为几的多线程机制编程可将程序的任务分解为几个并行的子任务,通过线程的并发执行来加速程序运个并行的子任务,通过线程的并发执行来加速程序运行,提高行,提高CPU的利用率。的利用率。例例10.1 在在程程序序中中通通过过继继承承Thread类类创创建建一一个个线线程程子子类类tes
10、tThread,通通过过Thread1主主类类同同时时运运行行两两个个线线程程对象对象t1和和t2,运行结果如图运行结果如图10.1所示。所示。class Thread1 public static void main(String args)testThread t1=new testThread(thread1);testThread t2=new testThread(thread2);t1.start();t2.start();10.2 创建线程创建线程 10.2.1 通过继承通过继承Thread类创建线程类创建线程 class testThread extends Thread pu
11、blic testThread(String str)super(str);/调用父类的构造方法为线程对象命名调用父类的构造方法为线程对象命名 public void run()for(int i=0;i3;i+)System.out.println(getName()+在运行在运行);try sleep(1000);/用休眠用休眠1000毫秒来区分哪个线程在运行毫秒来区分哪个线程在运行 System.out.println(getName()+在休眠在休眠);catch(InterruptedException e)System.out.println(getName()+已结束已结束);图
12、图 10.1(1)Application应应用用程程序序运运行行时时总总是是调调用用main方方法法,因因此此main是是创创建建和和启启动动线线程程对对象象的的地地方方。main本本身身也也是是一一个个线线程程,是是程程序序自自动动拥拥有有的的一一个个线线程程,称称为为主主线线程程。在在main方方法法中中创创建建了了两两个个testThread线线程程对对象象:t1与与t2,并并在在创创建建后后马马上上调调用用start方方法法启启动动了了这这两两个个线程。线程。(2)从从输输出出的的结结果果可可以以看看出出两两个个线线程程的的名名字字是是交交替替显显示示的的,这这是是因因为为两两个个线线
13、程程是是同同步步的的,于于是是,两两个个run方方法法也也同同时时被被执执行行。线线程程语语句句的的顺顺序序只只是是决决定定于于线线程程执执行行的的顺顺序序,线线程程的的执执行行顺顺序序是是由由系系统统调调度度和和控控制的。制的。(3)由由继继承承Thread创创建建的的子子类类,必必须须覆覆盖盖run方方法法,因因为为Thread线线程程类类的的run方方法法是是空空的的。run是是线线程程类类的的关关键键方方法法,线线程程的的所所有有活活动动都都是是通通过过它它来来实实现现的的。当当调调用用线线程程对对象象时时系系统统就就自自动动调调用用其其run方方法法,正正是是通通过过run方方法法才
14、才使使创创建建线线程程的的目目的的得得以以实实现现。run方方法的作用如同法的作用如同Application应用程序的应用程序的main方法一样。方法一样。由例子可以看出,创建线程对象,就是设计由例子可以看出,创建线程对象,就是设计run方法。方法。一旦启动线程对象,就进入一旦启动线程对象,就进入run方法,便执行方法,便执行run中中的所有语句,的所有语句,run方法执行完毕,这个线程也就结束方法执行完毕,这个线程也就结束了。了。通过通过Thread类创建线程子类的格式为:类创建线程子类的格式为:class 线程的类名线程的类名 extends Thread public void run(
15、)程序语句程序语句 当当一一个个类类是是从从其其他他类类继继承承时时,如如继继承承Applet类类。此此时时就就不不能能再再继继承承Thread类类来来创创建建线线程程,这这时时可可以以通通过过接接口口Runnable直直接接创创建建线线程程对对象象。接接口口Runnable是是一一个个抽抽象象接接口口,接接口口中中只只声声明明了了一一个个未未实实现现的的run方方法。法。10.2.2 通过通过Runnable接口创建线程接口创建线程 例例10.2 通通过过Runnable接接口口运运行行线线程程,运运行行结结果果如如图图10.2所示。所示。import java.awt.*;import j
16、ava.applet.Applet;import java.util.*;import java.text.DateFormat;public class Clock2 extends Applet implements Runnable Thread clockThread=null;public void init()setBackground(Color.blue);setForeground(Color.yellow);public void start()if(clockThread=null)clockThread=new Thread(this,Clock2);clockThre
17、ad.start();public void run()Thread myThread=Thread.currentThread();while(clockThread=myThread)repaint();try Thread.sleep(1000);catch(InterruptedException e)public void paint(Graphics g)Date date=new Date();DateFormat formatter=DateFormat.getTimeInstance();String str=formatter.format(date);g.drawStri
18、ng(str,5,10);public void stop()clockThread=null;图图 10.2通过例通过例10.2可以了解通过接口创建线程对象是通过可以了解通过接口创建线程对象是通过Thread类直接创建线程对象的。类直接创建线程对象的。在在Applet的的start方方法法中中用用new操操作作符符创创建建了了一一个个线线程对象程对象clockThread:clockThread=new Thread(this,Clock2);clockThread.start();此此时时,线线程程clockThread处处于于New Thread创创建建状状态态,是是一一个个空空线线程程
19、,因因为为还还没没有有为为它它分分配配系系统统资资源源。处处于于创创建建状状态态的的线线程程除除了了可可以以调调用用start方方法法开开始始线线程程外外,不不 能能 调调 用用 其其 他他 方方 法法,否否 则则 将将 产产 生生IllegalThreadStateException异常。异常。调调用用线线程程的的start方方法法后后,将将为为线线程程分分配配系系统统资资源源,并并将将线线程程加加入入线线程程队队列列,然然后后调调用用run方方法法运运行行线线程程。此此时时,线线程程转转入入Runnable可可运运行行状状态态。由由于于大大部部分分计计算算机机只只有有一一个个CPU,不不可
20、可能能同同时时运运行行所所有有处处于于Runnable状状态态的的线线程程,于于是是Java虚虚拟拟机机就就建建立立了了一一个个线线程程队队列列,让让这这些些线线程程以以排排队队的的方方式式轮轮流流使使用用CPU。在在 实实 现现 接接 口口 Runnable的的 run方方 法法 中中,又又 通通 过过Thread.currentThread方方法法创创建建了了一一个个当当前前运运行行的的线线程对象程对象myThread:Thread myThread=Thread.currentThread();设设计计Thread的的run方方法法。因因为为Thread的的run方方法法是是空空方方法法
21、,而而run方方法法是是完完成成线线程程任任务务的的根根本本途途径径,本本例例中通过接口中通过接口Runnable来实现来实现run方法的具体设计:方法的具体设计:首首先先创创建建一一个个线线程程对对象象myThread,然然后后根根据据判判断断条条件件如如果果当当前前线线程程是是clockThread,就就进进入入循循环环。在在循循环环中中先先执执行行repaint方方法法,它它将将调调用用paint显显示示系系统统时时间间。然然后后令令线线程程休休眠眠1000毫毫秒秒,此此时时线线程程将将停停止止运运行行。休休眠眠结结束束时时线线程程被被唤唤醒醒,如如果果CPU可可用用,就就会会继继续续运
22、运行这个线程,否则将排队等待。行这个线程,否则将排队等待。由由本本例例可可知知,接接口口Runnable只只是是提提供供了了一一个个可可以以实实现现run方法的途径。方法的途径。两种创建线程方法的比较:两种创建线程方法的比较:(1)由由继继承承Thread类类创创建建线线程程对对象象简简单单方方便便,可可以以直接操作线程,但不能再继承其他类;直接操作线程,但不能再继承其他类;(2)在继承其他类的类中可用在继承其他类的类中可用Runnable接口创建线接口创建线程对象。可保持程序风格的一致性。程对象。可保持程序风格的一致性。大大部部分分计计算算机机都都是是一一个个CPU,一一个个时时刻刻只只能能
23、运运行行一一个个线线程程。如如果果有有多多个个线线程程处处于于可可运运行行状状态态,需需要要排排队队等等待待CPU资资源源,此此时时线线程程自自动动获获得得一一个个线线程程的的优优先先级级,CPU资源分配是根据资源分配是根据“先到先服务先到先服务”的原则确定的。的原则确定的。Java为为了了使使有有些些线线程程可可以以提提前前得得到到服服务务,可可给给线线程程设设置置优优先先级级。在在单单个个CPU上上运运行行多多线线程程时时采采用用了了线线程程队队列列技技术术,Java虚虚拟拟机机支支持持固固定定优优先先级级队队列列,一一个个线线程程的的执执行行顺顺序序取取决决于于其其相相对对其其他他Run
24、nable线线程程的的优优先先级。级。10.3 线程的优先级线程的优先级 线线程程在在创创建建时时,继继承承了了父父类类的的优优先先级级。线线程程创创建建后后,可可以以在在任任何何时时刻刻调调用用setPriority方方法法改改变变线线程程的的优优先先级。优先级为级。优先级为110,Thread定义了其中定义了其中3个常数:个常数:(1)MAX_PRIORITY,最大优先级(值为最大优先级(值为10)。)。(2)MIN_PRIORITY,最小优先级(值为最小优先级(值为1)。)。(3)NORM_PRIORITY,默认优先级(值为默认优先级(值为5)。)。例例10.3 线程优先级的使用情况如图
25、线程优先级的使用情况如图10.3所示。所示。图图 10.3class Thread2 extends Thread public static void main(String args)Thread2 t=new Thread24;for(int i=0;i4;i+)ti=new Thread2();for(int i=0;i4;i+)ti.start();t1.setPriority(MIN_PRIORITY);t3.setPriority(MAX_PRIORITY);public void run()for(int i=0;i1000000;i+);System.out.println(
26、getName()+线线程程的的优优先先级级是是+getPriority()+已计算完毕已计算完毕!);通过线程的方法可以控制线程的状态。通过线程的方法可以控制线程的状态。1.挂起一个线程挂起一个线程如如果果要要暂暂停停一一个个线线程程可可使使用用suspend()方方法法:t1.suspend(),t1为为线线程程对对象象实实例例名名称称。在在想想运运行行线线程程时时,用用resume()方法重新激活线程:方法重新激活线程:t1.resume()。2.停止一个线程停止一个线程用用stop()方方法法可可以以停停止止线线程程的的执执行行:t1.stop()。注注意意:这这并并没没有有消消灭灭这
27、这个个线线程程,只只是是停停止止了了线线程程的的执执行行。但但这个线程不能用这个线程不能用t1.start()重新启动。重新启动。10.4 线程的控制线程的控制 3.线程休眠线程休眠如如果果让让线线程程停停止止运运行行几几毫毫秒秒可可使使用用sleep(long)方方法法,上面已经提到。上面已经提到。4.连接线程连接线程join()方方法法可可以以中中止止当当前前线线程程,等等待待调调用用该该方方法法的的线线程完成后再继续本线程。程完成后再继续本线程。5.暂停线程暂停线程调调用用yield()方方法法可可以以暂暂停停当当前前运运行行线线程程运运行行,但但处处于于可可运运行行状状态态。其其他他线
28、线程程可可照照样样运运行行。若若无无其其他他线线程程运运行,则继续运行该线程。行,则继续运行该线程。6.中断线程中断线程如如 果果 要要 中中 断断 一一 个个 运运 行行 中中 的的 线线 程程 可可 使使 用用 interrupt()方方 法法:t1.interrupt()。要运行该线程可使用要运行该线程可使用t1.start()重新启动。重新启动。7.了解线程的状态了解线程的状态如果要知道线程处于什么状态,可通过线程的如果要知道线程处于什么状态,可通过线程的isAlive()方法来了解,它将返回线程当前的状态。如果返回方法来了解,它将返回线程当前的状态。如果返回值为值为true,说明线程
29、处于说明线程处于Runnable或或Not Runnable状状态;如果返回值为态;如果返回值为false,说明线程处于说明线程处于New Thread或或Dead状态。该方法无法进一步区分具体状态。状态。该方法无法进一步区分具体状态。前前面面的的线线程程例例子子都都是是独独立立的的,而而且且异异步步执执行行,也也就就是是说说每每个个线线程程都都包包含含了了运运行行时时所所需需要要的的数数据据和和方方法法,不不需需要要外外部部资资源源,也也不不用用关关心心其其他他线线程程的的状状态态和和行行为为。但但有有时时一一些些同同时时运运行行的的线线程程需需要要共共享享数数据据。因因此此,编编程程时时必
30、必须须考考虑虑其其他他线线程程的的状状态态和和行行为为,以以解解决决资资源源共共享问题。享问题。Java提提供供了了同同步步设设定定功功能能。共共享享对对象象可可将将自自己己的的成成员员方方法法定定义义为为同同步步化化(synchronized)方方法法,通通过过调调用用同同步步化化方方法法来来执执行行单单一一线线程程,其其他他线线程程则则不不能能同同时时调调用同一个对象的同步化方法。用同一个对象的同步化方法。10.5 线程的同步机制与共享资源线程的同步机制与共享资源 例例10.4 生产者和消费者线程同步化问题示例。使用某生产者和消费者线程同步化问题示例。使用某种资源的线程称为消费者,产生或释
31、放这个资源的线种资源的线程称为消费者,产生或释放这个资源的线程称为生产者。生产者生成程称为生产者。生产者生成10个整数(个整数(09),存储),存储到一个共享对象中,并把它们打印出来。每生成一个到一个共享对象中,并把它们打印出来。每生成一个数就随机休眠数就随机休眠0100ms,然后重复这个过程。一旦然后重复这个过程。一旦这这10个数可以从共享对象中得到,消费者将尽可能快个数可以从共享对象中得到,消费者将尽可能快地消费这地消费这10个数,即把它们取出后打印出来。这个模个数,即把它们取出后打印出来。这个模型由型由4个程序组成。个程序组成。1.生产者程序生产者程序public class Produ
32、cer extends Thread private Share shared;private int number;public Producer(Share s,int number)shared=s;this.number=number;public void run()for(int i=0;i10;i+)shared.put(i);System.out.println(生产者生产者+this.number+输出的数据为:输出的数据为:+i);try sleep(int)(Math.random()*100);catch(InterruptedException e)2.消费者程序消费
33、者程序public class Consumer extends Thread private Share shared;private int number;public Consumer(Share s,int number)shared=s;this.number=number;public void run()int value=0;for(int i=0;ii)value=value-i;/取走时取走时,value值减少值减少 else /账户金额不够所取时账户金额不够所取时 i=value;value=0;/取走全部所余金额取走全部所余金额 return i;int howmatc
34、h()/查看账户上现有金额方法查看账户上现有金额方法 return value;class Save extends Thread /存款线程存款线程 private Account1 a1;private int amount;public Save(Account1 a1,int amount)this.a1=a1;this.amount=amount;public void run()synchronized(a1)/锁定账户对象锁定账户对象 int k=a1.howmatch();try sleep(1);/花费时间花费时间 catch(InterruptedException e)S
35、ystem.out.println(e);a1.put(amount);System.out.println(现有现有+k+,存入存入+amount+,余额余额+a1.howmatch();public static void main(String args)Account1 a1=new Account1();(new Save(a1,100).start();(new Save(a1,200).start();(new Fetch(a1,500).start();class Fetch extends Thread /取款线程取款线程 private Account1 a1;privat
36、e int amount;public Fetch(Account1 a1,int amount)this.a1=a1;this.amount=amount;public void run()synchronized(a1)/锁定账户对象锁定账户对象 int k=a1.howmatch();try sleep(1);/花费时间花费时间 catch(InterruptedException e)System.out.println(e);System.out.println(现有现有+k+,取走取走+a1.get(amount)+,余额余额+a1.howmatch();在在 这这 里里 使使 用
37、用 的的 同同 步步 方方 法法 非非 常常 简简 单单,仅仅 使使 用用 了了synchronized关关键键字字锁锁定定了了账账户户对对象象a1,保保证证同同一一时时间间 内内 只只 有有 一一 个个 线线 程程 可可 以以 获获 取取 这这 个个 对对 象象。使使 用用synchronized关关键键字字锁锁定定对对象象资资源源后后,只只有有在在该该线线程程获获得得共共享享资资源源对对象象后后,方方可可运运行行。任任何何时时刻刻都都只只有有一一个个获获得得共共享享资资源源对对象象的的程程序序在在运运行行,其其他他线线程程在在获获得得共享资源对象前处于等待状态。共享资源对象前处于等待状态。
38、这种方式称为这种方式称为“同步对象同步对象”。当第一个线程执行带有。当第一个线程执行带有同步对象的代码时,获得使用该对象的使用权,或称同步对象的代码时,获得使用该对象的使用权,或称拥有该对象的锁。当线程执行完代码时,自动释放锁,拥有该对象的锁。当线程执行完代码时,自动释放锁,等待的第二个线程获得锁并开始运行。等待的第二个线程获得锁并开始运行。考考虑虑到到多多线线程程时时,人人们们立立刻刻会会想想到到某某些些任任务务是是可可以以使使用用多多线线程程的的,例例如如数数据据计计算算、数数据据库库查查询询,以以及及输输入入的的获获得得。因因为为这这些些任任务务通通常常都都被被认认为为是是后后台台任任务
39、务,不不直直接接与与用用户户打打交交道道。在在Java语语言言程程序序设设计计中中,动动态态效效果果的的程程序序都都会会使使用用多多线线程程,例例如如动动画画的的播播放放、动动态态的的字幕,等等。字幕,等等。10.6 何时使用多线程及注意问题何时使用多线程及注意问题 在在程程序序中中使使用用多多线线程程是是有有代代价价的的。它它会会对对系系统统产产生生以以下影响:下影响:(1)线程需要占用内存;线程需要占用内存;(2)线程过多,会消耗大量线程过多,会消耗大量CPU时间来跟踪线程;时间来跟踪线程;(3)必必须须考考虑虑多多线线程程同同时时访访问问共共享享资资源源的的问问题题,如如果果没没有有协协
40、调调好好,就就会会产产生生令令人人意意想想不不到到的的问问题题,例例如如可怕的死锁和资源竞争;可怕的死锁和资源竞争;(4)因为同一个任务的所有线程都共享相同的地址因为同一个任务的所有线程都共享相同的地址空间,并共享任务的全局变量,所以程序也必须考虑空间,并共享任务的全局变量,所以程序也必须考虑多线程同时访问全局变量的问题。多线程同时访问全局变量的问题。10-1 Java语言中的线程和多线程指的是什么?语言中的线程和多线程指的是什么?10-2 用继承的方法创建一个多线程程序。用继承的方法创建一个多线程程序。10-3 使用接口使用接口Runnable创建一个多线程程序。创建一个多线程程序。10-4
41、 同步机制有什么作用?同步机制有什么作用?10-5 能能否否在在生生产产者者和和消消费费者者模模型型中中使使用用synchronized关关键键词词锁锁定定资资源源对对象象达达到到同同步步的的目目的的,请请你你重重写写程程序序,并在机上进行试验。并在机上进行试验。习题习题 10-6 下面有关线程的哪些叙述是对的。(下面有关线程的哪些叙述是对的。(BD)A.一旦一个线程被创建,它就立即开始运行。一旦一个线程被创建,它就立即开始运行。B.使使用用start()方方法法可可以以使使一一个个线线程程成成为为可可运运行行的的,但但是是它它不不一一定立即开始运行。定立即开始运行。C.当当一一个个线线程程因因为为抢抢先先机机制制而而停停止止运运行行,它它被被放放在在可可运运行行队队列的前面。列的前面。D.一个线程可能因为不同的原因停止运行并进入就绪状态。一个线程可能因为不同的原因停止运行并进入就绪状态。10-7 方法方法resume()负责恢复哪些线程的执行负责恢复哪些线程的执行?(D)A.通过调用通过调用stop()方法而停止的线程。方法而停止的线程。B.通过调用通过调用sleep()方法而停止运行的线程。方法而停止运行的线程。C.通过调用通过调用wait()方法而停止运行的线程。方法而停止运行的线程。D.通过调用通过调用suspend()方法而停止运行的线程。方法而停止运行的线程。
限制150内