1、线程及答案解析(总分:48.00,做题时间:90 分钟)一、选择题(总题数:16,分数:32.00)1.下面程序中需要对 Employee的对象进行存储,请在下画线处填入正确选项_。class Emloyee implements_(分数:2.00)A.ComparableB.SerializableC.CloneableD.DataInput2.线程在生命周期中要经历 5种状态。如果线程当前是新建状态,则它可到达的下一个状态是_。(分数:2.00)A.运行状态B.阻塞状态C.可运行状态D.终止状态3.线程生命周期中正确的状态是_。(分数:2.00)A.新建状态、运行状态和终止状态B.新建状态
2、、运行状态、阻塞状态和终止状态C.新建状态、可运行状态、运行状态、阻塞状态和终止状态D.新建状态、可运行状态、运行状态、恢复状态和终止状态4.下列关于 Java多线程并发控制机制的叙述中,错误的是_。(分数:2.00)A.Java中对共享数据操作的并发控制是采用加锁技术B.线程之间的交互,提倡采用 suspend()/resume()方法C.共享数据的访问权限都必须定义为 privateD.Java中没有提供检测与避免死锁的专门机制,但应用程序员可以采用某些策略防止死锁的发生5.下列叙述中,错误的是_。(分数:2.00)A.Java中没有检测和避免死锁的专门机制B.程序中多个线程互相等侍对方持
3、有的锁,可能形成死锁C.为避免死锁,Java 程序中可先定义获得锁的顺序,解锁是按加锁的反序释放D.为避免死锁,Java 程中可先定义获得锁的顺序,解锁是按加锁的正序释放6.如果线程正处于运行状态,可使该线程进入阻塞状态的方法是_。(分数:2.00)A.yield()B.start()C.wait()D.notify()7.请阅读下面程序public class ThreadTestpublic static void inain(String args) throws Exceptionint i=0;Hello t=new Hello();_;while(true)System.out.p
4、rintIn (“Good Morning“+j+);if(i=2LisAlive()System.out.printIn(“Main waiting for Hello!“);T.join();/等待 t运行结束if(i=5)break;class Hello extends Threadint i ;public void run()while(true)System.out.printIn(“Hello“+i+);if(i=5) break;为使该程序正确执行,下画线处的语句应是_。(分数:2.00)A.sleep()B.yield()C.interrupt()D.start()8.阅读
5、下面程序1 public class Try extends Thread2 Public static void main (String args)3 Try t=new Try();4 t.start();5 67 Public void run (int j) 8 int i=0;9 while (i5)10 System.out.printIn(“祝你成功!“);11 i+;12 13 14 该程序要求打印 5行“祝你成功!“,必须改正程序中的某行代码,程序才能完成,选择正确的修改是_。(分数:2.00)A.将第 1行的 extends Thread改为 implements Run
6、nableB.将第 3行的 new Try()改为 new Thread()C.将第 4行的 t.start()改为 start(t)D.将第 7行的 public void run(int j)改为 public void run()9.可以使当前同级线程重新获得运行机会的方法是_。(分数:2.00)A.sleep()B.join()C.yield()D.interrupt()10.如果使用 Thread t=new Test()语句创建一个线程,则下列叙述正确的是_。(分数:2.00)A.Test类一定要实现 Runnable接口B.Test类一定是 Thread类的子类C.Test类一定
7、是 Runnable类的子类D.Test类一定是继承 Thread类并且实现 Runnable接口11.请阅读下面程序public class ThreadTest public static vodi main(Sting args)Thread t1=new Thread(new Hello();Thread t2=new Thread(new Hello();t1.start();t2.start();class Hello implements Runnableint i;public void run()while (true)System.out.printIn(“Hello“+i
8、+);if(i=5) break;该程序创建线程使用的方法是_。(分数:2.00)A.继承 Thread类B.实现 Runnable接口C.t1.start()D.t2.start()12.下列方法中,声明抛出 InterruptedException异常的方法是_。(分数:2.00)A.suspend()B.resume()C.sleep()D.start()13.下列关于 Java语言中线程的叙述中,正确的是_。(分数:2.00)A.线程是由代码、数据、内核状态和一组寄存器组成的B.线程间的数据是不共享的C.用户只能通过创建 Thread类的实例或定义,创建 Thread子类的实例建立和控
9、制自己的线程D.因多线程并发执行而引起的执行顺序的不稳定性可能造成执行结果的不稳定14.Thread类中能运行线程体的方法是_。(分数:2.00)A.start()B.resume()C.init()D.run()15.阅读下面程序class Test implements Runnable public static void main (String args)Test t=new Test();t.start();public void run()下列关于上述程序的叙述正确的是_。(分数:2.00)A.程序不能通过编译,因为 start()方法在 Test类中没有定义B.程序编译通过,但
10、运行时出错,提示 start()方法没有定义C.程序不能通过编译,因为 run()方法没有定义方法体D.程序编译通过,且运行正常16.下列叙述中,正确的是_。(分数:2.00)A.线程与进程在概念上是不相关的B.一个线程可包含多个进程C.一个进程可包含多个线程D.Java中的线程没有优先级二、填空题(总题数:8,分数:16.00)17.Java中的线程体是由线程类的 1 方法进行定义的,线程运行时,也是从该方法开始执行。(分数:2.00)填空项 1:_18.Java中线程模型由虚拟的 CPU,代码与数据构成。该模型是由 java.lang. 1类进行定义和描述的。(分数:2.00)填空项 1:
11、_19.在 Java线程中,共享数据的所有访问都必须作为临界区,使用 1 进行加锁控制。(分数:2.00)填空项 1:_20.在 Java程序中,主线程一般具有 1 优先级。(分数:2.00)填空项 1:_21.当实现 Runnable接口时,要实现的方法是 1。(分数:2.00)填空项 1:_22.在 Java中,线程的模型就是一个 CPU、程序代码和 1 的封装体。(分数:2.00)填空项 1:_23.下列程序的功能是创建了一个显示 5个“Hello!”的线程并启动运行,请将程序补充完整。public class ThreadTest extends Thread public stati
12、c void main (String args)ThreadTest t=new_;t.start();public void run()int i=0;while(true)System.out.printIn( “Hello!“);if (i+=4)break;(分数:2.00)填空项 1:_24.Java对象串行化技术,主要是通过 1 类和 ObjectOutputStream类来实现。(分数:2.00)填空项 1:_线程答案解析(总分:48.00,做题时间:90 分钟)一、选择题(总题数:16,分数:32.00)1.下面程序中需要对 Employee的对象进行存储,请在下画线处填入正
13、确选项_。class Emloyee implements_(分数:2.00)A.ComparableB.Serializable C.CloneableD.DataInput解析:解析 要对对象进行存储,首先要将对象串行化。一个类只有实现了 Serializable接口,它的对象才是串行化的。因此如果要串行化某些类的对象,这些类就必须实现 Serializable接口。故本题的正确选项是 B。2.线程在生命周期中要经历 5种状态。如果线程当前是新建状态,则它可到达的下一个状态是_。(分数:2.00)A.运行状态B.阻塞状态C.可运行状态 D.终止状态解析:解析 线程一旦开始,就开始了它的生命
14、周期。线程的声明周期主要分为:新建状态(New),线程创建后处于该状态;可运行状态(Runnable),新建的线程调用 start()方法,使线程的状态从 New变为Runnable,所以选项 C正确;运行状态(Running),运行状态使线程占有 CPU并实际运行的状态;阻塞状态(Blocked),导致该状态的原因很多。需要注意区别的是:终止状态(Dead)是线程执行结束的状态,没有任何方法可以改变它的状态。3.线程生命周期中正确的状态是_。(分数:2.00)A.新建状态、运行状态和终止状态B.新建状态、运行状态、阻塞状态和终止状态C.新建状态、可运行状态、运行状态、阻塞状态和终止状态 D.
15、新建状态、可运行状态、运行状态、恢复状态和终止状态解析:解析 线程生命周期中出现的状态有:新建状态、可运行状态、运行状态、阻塞状态和终止状态。其中阻塞状态又分为对象锁阻塞、等待阻塞和其他阻塞。所以 C项的说法正确。4.下列关于 Java多线程并发控制机制的叙述中,错误的是_。(分数:2.00)A.Java中对共享数据操作的并发控制是采用加锁技术B.线程之间的交互,提倡采用 suspend()/resume()方法 C.共享数据的访问权限都必须定义为 privateD.Java中没有提供检测与避免死锁的专门机制,但应用程序员可以采用某些策略防止死锁的发生解析:解析 线程之间的交互,提倡采用 wa
16、it()和 notify()方法,这两个方法是 java.lang.object类的方法,是实现线程通信的两个方法,不提倡使用 suspent()和 resume()方法,它们容易造成死锁,所以选项 B的说法是错误的。5.下列叙述中,错误的是_。(分数:2.00)A.Java中没有检测和避免死锁的专门机制B.程序中多个线程互相等侍对方持有的锁,可能形成死锁C.为避免死锁,Java 程序中可先定义获得锁的顺序,解锁是按加锁的反序释放D.为避免死锁,Java 程中可先定义获得锁的顺序,解锁是按加锁的正序释放 解析:解析 Java 中没有检测与避免死锁的专门机制。应用程序可以采用一般的做法是:如果程
17、序要访问多个共享数据,则要首先从全局考虑定义一个获得锁的顺序,并且在整个程序中都遵守这个顺序。释放时,要按加锁的反序释放。所以 D项说法不正确。6.如果线程正处于运行状态,可使该线程进入阻塞状态的方法是_。(分数:2.00)A.yield()B.start()C.wait() D.notify()解析:解析 如果发生下面几种情况时,处于运行状态的线程就进入阻塞状态:线程调用了 sleep()方法、join()方法时:线程调用 wait()方法时;如果线程中使用 synchronized来请求对象的锁未获得时;如果线程中有输入/输出操作,则将进入阻塞状态,待输入/输出操作结束后,线程进入可运行状
18、态。所以本题正确答案是 C。7.请阅读下面程序public class ThreadTestpublic static void inain(String args) throws Exceptionint i=0;Hello t=new Hello();_;while(true)System.out.printIn (“Good Morning“+j+);if(i=2LisAlive()System.out.printIn(“Main waiting for Hello!“);T.join();/等待 t运行结束if(i=5)break;class Hello extends Threadi
19、nt i ;public void run()while(true)System.out.printIn(“Hello“+i+);if(i=5) break;为使该程序正确执行,下画线处的语句应是_。(分数:2.00)A.sleep()B.yield()C.interrupt()D.start() 解析:解析 本程序的 ThreadTest类中新建了一个 Hello线程 t,并且在后面的程序中调用了线程 t的方法,所以应该通过 start()方法启动该线程。t.sleep()、t.yield()使处于运行状态下的线程进入阻塞状态,t.interrupt()使处于等待阻塞状态下的线程进入对象锁阻
20、塞状态。所以正确选项应该是 D。8.阅读下面程序1 public class Try extends Thread2 Public static void main (String args)3 Try t=new Try();4 t.start();5 67 Public void run (int j) 8 int i=0;9 while (i5)10 System.out.printIn(“祝你成功!“);11 i+;12 13 14 该程序要求打印 5行“祝你成功!“,必须改正程序中的某行代码,程序才能完成,选择正确的修改是_。(分数:2.00)A.将第 1行的 extends Thr
21、ead改为 implements RunnableB.将第 3行的 new Try()改为 new Thread()C.将第 4行的 t.start()改为 start(t)D.将第 7行的 public void run(int j)改为 public void run() 解析:解析 题目中程序通过继承 Thread类创建了一个线程,通过这种方式创建线程时必须重写 run()方法。而 run()方法的定义是:public void run()。仔细阅读程序,发现第 7行中的 run()方法带有一个参数,而 Thread类中的 run()方法是没有参数的,所以应该把第 7行的 public
22、void run(intj)改为public void run()。D 为正确选项。9.可以使当前同级线程重新获得运行机会的方法是_。(分数:2.00)A.sleep()B.join()C.yield() D.interrupt()解析:解析 yield()方法使具有与当前线程相同优先级的线程有运行的机会。如果没有同等优先级的线程是可运行状态,yeild()方法将什么也不做。只有 yield()方法可以使当前同级线程重新获得运行机会。10.如果使用 Thread t=new Test()语句创建一个线程,则下列叙述正确的是_。(分数:2.00)A.Test类一定要实现 Runnable接口 B
23、.Test类一定是 Thread类的子类C.Test类一定是 Runnable类的子类D.Test类一定是继承 Thread类并且实现 Runnable接口解析:解析 无论通过哪些方式来创建线程,都必须通过 run()方法定义它的线程体,因为一个线程开始执行时,就是从它的 run()方法开始执行的。Runnable 接口中定义了抽象 run()方法,而 Thread类本身也实现了 Runnable接口,所以在创建一个线程的时候必须实现 run()方法,即一定要实现 Runnable接口。11.请阅读下面程序public class ThreadTest public static vodi m
24、ain(Sting args)Thread t1=new Thread(new Hello();Thread t2=new Thread(new Hello();t1.start();t2.start();class Hello implements Runnableint i;public void run()while (true)System.out.printIn(“Hello“+i+);if(i=5) break;该程序创建线程使用的方法是_。(分数:2.00)A.继承 Thread类B.实现 Runnable接口 C.t1.start()D.t2.start()解析:解析 实现 R
25、unnale接口和继承 Thread类是创建线程的两种方式。很明显本程序中实现了Runnable接口,故正确答案是 B。12.下列方法中,声明抛出 InterruptedException异常的方法是_。(分数:2.00)A.suspend()B.resume()C.sleep() D.start()解析:解析 如果一个线程 t调用 sleep()、join()、wait()等方法被阻塞时,则 t.interrupt方法将使 t的中断状态被清除,中断 t的阻塞状态,并且 t将接收到 InterruptException异常。通过以上介绍可知本题正确答案为 C。13.下列关于 Java语言中线程
26、的叙述中,正确的是_。(分数:2.00)A.线程是由代码、数据、内核状态和一组寄存器组成的B.线程间的数据是不共享的C.用户只能通过创建 Thread类的实例或定义,创建 Thread子类的实例建立和控制自己的线程D.因多线程并发执行而引起的执行顺序的不稳定性可能造成执行结果的不稳定 解析:解析 线程是不包含进程地址空间中的代码和数据。数据可以被多个线程共享,也可不共享。在多线程的程序中,当多个线程并发执行时,虽然各个线程中语句的执行顺序是确定的,但线程的相对执行顺序是不确定的。这种线程运行的不确定性将会产生执行结果的不确定性。所以 D项的说法是正确的。14.Thread类中能运行线程体的方法
27、是_。(分数:2.00)A.start() B.resume()C.init()D.run()解析:解析 start()是 Thread类中的方法。新建的线程不会自动运行,必须调用线程的 start()方法才能运行。resume()方法是 Thread类提供的用于线程控制的方法。15.阅读下面程序class Test implements Runnable public static void main (String args)Test t=new Test();t.start();public void run()下列关于上述程序的叙述正确的是_。(分数:2.00)A.程序不能通过编译,因
28、为 start()方法在 Test类中没有定义 B.程序编译通过,但运行时出错,提示 start()方法没有定义C.程序不能通过编译,因为 run()方法没有定义方法体D.程序编译通过,且运行正常解析:解析 start()是 Thread类中的方法,而本程序中 Test类实现了 Runnable接口,Runnable 接口中只定义了一个抽象方法 run(),故 Test类不能调用 start()方法。编译时会出现 start()方法未定义的错误。所以,本题的正确选项是 A。16.下列叙述中,正确的是_。(分数:2.00)A.线程与进程在概念上是不相关的B.一个线程可包含多个进程C.一个进程可包
29、含多个线程 D.Java中的线程没有优先级解析:解析 进程与线程的关系:进程是程序的一次动态执行,它对应了代码从加载到执行完毕的一个完整的过程。作为执行蓝本的同一段程序,可以被多次加载到系统的不同内存区域执行,形成不同的线程,而线程是比进程更小的单位。由于每个线程都是一个独立执行自身程序的不同抑制流,因此一个包含多线程的进程也能实现多项任务的并发执行。所以说一个进程可以包含多个线程。故本题中说法正确的是 C。二、填空题(总题数:8,分数:16.00)17.Java中的线程体是由线程类的 1 方法进行定义的,线程运行时,也是从该方法开始执行。(分数:2.00)填空项 1:_ (正确答案:run)
30、解析:解析 Java 中的线程体是由线程类的 run-|_|-方法进行定义的,在该方法中定义线程的具体行为。当线程运行时,也是从它的 run-|_|-方法开始执行的,就像 Java application从 main-|_|-开始执行一样。18.Java中线程模型由虚拟的 CPU,代码与数据构成。该模型是由 java.lang. 1类进行定义和描述的。(分数:2.00)填空项 1:_ (正确答案:Thread)解析:解析 线程模型在 Java中是由 java.lang.Thread类进行定义和描述的。程序中的线程都是Thread的实例。19.在 Java线程中,共享数据的所有访问都必须作为临界
31、区,使用 1 进行加锁控制。(分数:2.00)填空项 1:_ (正确答案:synchronized)解析:解析 在 java线程中,共享数据的所有访问都必须作为临界区,使用 synchronized进行加锁控制,而且用 synchronized保护的共享数据必须是私有的。20.在 Java程序中,主线程一般具有 1 优先级。(分数:2.00)填空项 1:_ (正确答案:普通)解析:解析 Java 中的线程是有优先级的。Thread 类有 3个关于线程优先级的静态常量:MIN_PRIORITY、MAX_PRIORITY、NORM_PRIORITY。一般情况下,主线程具有普通优先级 NORM_PR
32、JORITY,其值默认为 5。21.当实现 Runnable接口时,要实现的方法是 1。(分数:2.00)填空项 1:_ (正确答案:run-|_|-)解析:解析 主线程有两个创建方法,其中一种实现 Runnable接口。在 Runnable接口中只定义了一个run-|_|-方法,因此实现该接口中的 run-|_|-方法。22.在 Java中,线程的模型就是一个 CPU、程序代码和 1 的封装体。(分数:2.00)填空项 1:_ (正确答案:程序数据)解析:解析 Java 中的线程模型包含三部分:(1) 一个虚拟的 CPU; (2)该 CPU执行的代码:(3)代码所操作的数据。其中的代码与数据
33、是相互独立的,它们均可被多个线程共享。23.下列程序的功能是创建了一个显示 5个“Hello!”的线程并启动运行,请将程序补充完整。public class ThreadTest extends Thread public static void main (String args)ThreadTest t=new_;t.start();public void run()int i=0;while(true)System.out.printIn( “Hello!“);if (i+=4)break;(分数:2.00)填空项 1:_ (正确答案:ThreadTest())解析:解析 题目程序的功能
34、是按要求实现输出的,通过继承 Thread类来创建线程。Thread 类本身实现了 Runnable接口,所以在 java.lang的 Thread类的定义中可以发现 run()方法,通过继承 Thread类,必须重写其中的 run()方法定义线程体,然后创建该子类的对象创建线程。题目缺少线程创建语句,因此应该填写:ThreadTestt=new ThreadTest()。类 ThreadTest继承了 Thread类,并将 Thread类的 run()方法进行了重写。24.Java对象串行化技术,主要是通过 1 类和 ObjectOutputStream类来实现。(分数:2.00)填空项 1:_ (正确答案:ObjectInputStream)解析:解析 将 Java程序中的对象保存在外存中,称为对象永久化。Java 中定义了两种类型的字节流ObjectInputStream和 ObjectOutputStream支持对象的读写,一般将这两种类型的字节流称为对象流。