java习题及答案第7章 习题参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7章多线程编程
1.什么是线程?与进程有何不同?
答:线程是操作系统中重要概念之一,是程序运行的基本执行单元,与进程一样,也有创建、销毁和切换等状态,但负荷远小于进程,又称为轻量级进程。与进程不同的是:占用的资源少,不像进程那样可由几个线程组成,在Java语言中,用ng.Thread类创建和管理线程,而进程是由ng.Process类等类创建和管理。
2.使用多线程的优势何在?
答:使用多线程具有很多优势,这主要表现在如下五方面:充分利用CPU资源;简化编程模型;简化异步事件的处理;使GUI程序更有效率;节约成本。
3.主要的线程状态有哪些?它们之间是如何转换的?
答:线程主要有如下5个状态:New(新)、Runnable(可运行、就绪)、Running(运行)、Blocked(被阻塞、挂起)和Dead(死亡),它们之间转换如下图所示:
4.简述创建线程的两种方法及各自的步骤。
答:第一种方法是通过继承Thread类编写用户自己的线程类,而后创建实例,步骤为:
➢定义自己的线程类MyThread,并覆盖Thread类的run(),实现所需功能;
➢实例化MyThread类,并用start()方法启动。
第二种方法是通过实现Runnable接口来创建线程,使用Runnable接口创建线程的步骤为:
➢实现Runnable接口,如实现了该接口的类为MyRunnable,并在MyRunnable类的run()方法里编写想让线程执行的代码;
➢创建实现了Runnable接口类的实例,如创建MyRunnable类的实例为myRunnable;
➢创建线程类Thread的实例,并用构造方法Thread(Runnable)将myRunnable赋值给target。5.简述sleep()方法的作用,并修改例7.10中休眠部分,体会线程有无休眠的差异。
答:sleep()作为休眠方法,可让线程休眠一段时间,此期间线程不消耗CPU资源。传入参数是休眠的时间,单位为毫秒。
例7.10中休眠部分是AddOneThread类run()方法中的sleep()语句,可注释掉或调整休眠时间来体会运行过程差异。
6.复习线程同步概念,编写一个读写队列的程序,要求至少包含一个写队列线程和一个读队列线程。
答:Java语言提供了关键字synchronized来实现多个线程的同步,并区分为两种实现方法:一种是方法同步,另一种是对象同步。其中,方法同步是为了防止多线程访问同一方法导致数据崩溃。具体来说,在定义方法时加上关键字synchronized修饰即可,这能保证某一线程在其他任何线程访问这一方法前完成一次执行,即某一线程一旦启动对该方法的访问,其他线程只能等待这个线程执行完这个方法后在访问;对象同步是针对某一数据对象而言的,即synchronized关键字还可以放在对象前面限制访问该对象的一段代码,表示该对象在任何时刻只能由一个线程访问。
编写读写队列的程序提示:多个线程同步除了要用关键字synchronized外,还需要用join()方法确保线程全部执行完。
7.深入理解wait()和notify()方法使用,设计一种发生死锁的程序,并修改正确。
答:Java语言的ng.Object类提供了wait()、notify()和notifyAll()等三个方法来协调线程间的运行进度关系,实现线程通信的,这些方法用于实现线程间的通信,即某线程执行完后通知另一线程继续工作,或者某一线程运行过程中需要某一资源时可等待另一线程释放出或产生出该资源,例7.11很好地说明了这点,可以参考该例修改,最简单来说,改用wait()地方不用,或放错位置。
8.试着使用线程组来管理习题6编写的程序。
答:提示:定义2个ThreadGroup对象,分别用于管理写队列线程和读队列线程,并分别将创建的写或读线程放入相应的线程组中,便于管理,主要语句如下:。
ThreadGroup writerGroup=new ThreadGroup("WriterThreadGroup");
ThreadGroup readerGroup=new ThreadGroup("ReaderThreadGroup");
Thread myThread1=new Thread(writerGroup, "writer");
Thread myThread2=new Thread(readerGroup, "reader");
myThread1.start();
myThread2.start();