Java高级程序设计实战教程(戴远泉第2版) 课后练习题库答案 学习领域6 课后习题_第1页
Java高级程序设计实战教程(戴远泉第2版) 课后练习题库答案 学习领域6 课后习题_第2页
Java高级程序设计实战教程(戴远泉第2版) 课后练习题库答案 学习领域6 课后习题_第3页
Java高级程序设计实战教程(戴远泉第2版) 课后练习题库答案 学习领域6 课后习题_第4页
Java高级程序设计实战教程(戴远泉第2版) 课后练习题库答案 学习领域6 课后习题_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习领域6Java多线程机制

课后习题

一、填空题

1.调用Thread类的start()方法可以判断一个线程是否存活。

2.当某个类实现Runnable接口时,需要实现该接口的run()方法。

3Java语言中线程优先级的默认值是—5-。

4.实现多线程的两种方式是:1、继承Thread类;2、实现Runnable接口。

5、取得当前线程的语句是:Thread.currentThread。;

6.主线程的名称是main,默认创建的第一个子线程的名称是thread-0

7.可以调用Thread类的方法getPriority()和setPriority()来存取线程的优

先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺

省是5(NORM_PRIORITY)。

8.当多个线程同时运行时,会产生数据错误及其它冲突问题。Java语言提供了

线程同步控制机制,一是synchronized锁定共享资源,使得在任何时刻只有

一个线程能够访问共享资源,以保持共享资源的完整和一致,二是让互相通信的

线程同步运行,以保证通信的正确性。

9.线程之间的通信有两种方法:一是把共享变量和方法封闭在一个类中,二是利

用系统方法wait。和notify。控制线程通信.

K).实现对共享资源互斥访问的方法是在方法声明中加入synchronized关键字

来声明一个访问共享资源的方法,或者声明同步块。

二、单选题

[Thread类位于(C)包中。

A.java.sqlB.java.ioC.java.langD.java.util

2.用户在创建线程时所处的状态是(D),在用户使用该线程实例调用start()

方法之前,线程处于该状态。

A.等待状态B.死亡状态C.休眠状态D.出生状态

3.线程同步需要使用(B)关键字。

A.synchronsB.synchronizedC.implementsD.extends

4.下列说法中,错误的是(A)。

A.线程的调度执行时按照其优先级的高低顺序执行的。

B.一个线程创建好后即可立即执行。

C.用户程序类可以通过实现Runnable接口来定义程序线程。

D.解除处于阻塞状态的线程后,线程便进入就绪状态。

5.下列关于Java线程的说法那些是正确的(B)

A.每一个Java线程可以看成由代码、一个真实的CPU以及数据三部份组成。

B.创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类

问题。

C.Thread类属于java.util程序包。

D.以上说法无一正确。

6.运行下列程序,会产生什么结果?(D)

publicclassXextendsThreadimplementsRunable{

publicvoidrun(){

System.out.println("thisisrun()");

)

publicstaticvoidmain(Stringargs口){

Threadt=newThread(newX());

t.start();

}

)

A.第一行会产生编译错误

B.第六行会产生编译错误

C.第六行会产生运行错误

D.程序会运行和启动

7.线程生命周期中正确的状态是(C)

A.新建状态、运行状态和终止状态

B.新建状态、运行状态、阻塞状态和终止状态

C.新建状态、可运行状态、阻塞状态、等待状态、定时等待状态和终止状态

D.新建状态、可运行状态、运行状态、恢复状态和终止状态

8.Thread类中能运行线程体的方法是(D)

A.start()B.resume()

C.init()D.run()

9.在线程同步中,为了唤醒另一个等待的线程,使用下列方法(C)

A.sleepQB.wait()C.notify()D.join()

10.为了得到当前正在运行的线程,可使用下列哪个方法?(B)

A.getName()B.Thread.CurrentThread().B.sleep()D.run()

11.以下(D)不属于线程的状态。

A.就绪状态B.运行状态C.挂起状态D.独占状态

12.当线程被创建后,其所处的状态是(D)

A.阻塞状态B.运行状态C.就绪状态D.新建状态

13.当线程调用start。后,其所处状态为(C)

A.阻塞状态B.运行状态C.就绪状态D.新建状态

14.Thread.sleep()方法调用后,当等待时间未到,该线程所处状态为(A)

A.阻塞状态B.运行状态C.就绪状态D.新建状态

15.新生状态的线程其可能直接进入的状态是(D)

A.阻塞状态B.运行状态C.新建状态D.结束状态

16.Thread.sleep()方法调用后,当等待时间已到,该线程所处状态为(C)

A.阻塞状态B.运行状态C.就绪状态D.新建状态

17.当线程因异常而退出run()后,其所处状态为(D)

A.阻塞状态B.运行状态C.就绪状态D.结束状态

18.在Java多线程中,请用下面哪种方式不会使线程进入阻塞状态(D)

A.sleep()

B.SuspendQ

C.waitQ

D.yield()

19.关于sleep。和wait。,以下描述错误的一项是(D)

A.sleep是线程类(Thread)的方法,wait是Object类的方法

B.sleep不释放对象锁,wait放弃对象锁

C.sleep暂停线程、但监控状态仍然保持,结束后会自动恢复

D.wait后进入等待锁定池,只针对此对象发出notify方法后获取对象锁进入运

行状态。

20.下列说法中,错误的是(A)。

A.线程就是程序

B.线程是一个程序的单个执行流

C.多线程是指一个程序的多个执行流

D.多线程用于实现并发

三、简答题

1.什么是进程和线程?两者的区别是什么?

答题要点:

进程是计算机中的程序关于某数据集合上的一次运行活动,程序一旦运行就是进

程。进程是系统进行资源分配和调度的基本单位。

线程是进程的一个实体,是进程的一条执行路径。线程是程序执行流的最小单元,

是被系统独立调度和分派的基本单位。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。

进程和线程的区别体现在以下几个方面:

(1)地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线

程间共享。某进程内的线程在其他进程内不可见。

(2)通信:进程间通信IPC(管道,信号量,共享内存,消息队列),线程间可

以直接独写进程数据段(如全局变量)来进程通信——需要进程同步和互斥手段

的辅助,以保证数据的一致性。

(3)调度和切换:线程上下文切换比进程上下文切换快得多。

(4)在多线程OS中,进程不是一个可执行的实体。

2.编写多线程类有几种实现方式?它们各自的优缺点是什么?

答题要点:

有两种实现方式:

继承Thread类和实现Runnable接口。

继承Thread类的缺点:该类无法继承别的类。

实现Runnable接口的缺点代码复杂

3.JDK中线程的生命周期包括哪几种状态?

答题要点:

线程是一个动态的概念,从创建、运行和变化、消亡(死亡)就是一个生命

周期。JDK中用Thread.State类定义了线程生命周期内的6种状态,包含了NEW、

RUNNABLE.BLOCKEDWAITING.TIMED_WAITING.TERMINATEDO

4.线程的优先级范围是什么?如何实现优先级?

答题要点:

线程的优先级为1-10,一般使用Thread的类常量,不会手动赋值

可以通过setPriority()方法去改变它的默认值

5.为什么多线程中要引入同步机制?Java中如何实现线程的同步?

答题要点:

在多线程编程里面,一些较为敏感的数据是不允许被多个线程同时访问的,

具有排他性,即互斥。在互斥的基础上,通过同步机制实现访问者对资源的有序

访问,确保数据在任何时刻最多只有一个线程访问,保证数据的完整性。

多线程的同步方法大体分为以下几种:

使用同步关键字(synchronized)

使用重入锁类(ReentrantLock)

使用特殊域变量关键字(volatile)

使用局部变量(ThreadLocal)

使用原子变量(Atomiclnteger)

使用阻塞队列

6.线程的调度有哪些方法?各有什么功能?

答题要点:

(1)分时调度

所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。

(2)抢占式调度

优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一

个(线程随机性),Java使用的为抢占式调度。

7.Thread类的sleep。方法和对象的wait。方法都可以让线程暂停执行,它们有什

么区别?

答题要点:

sleep。方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程

暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保

持,因此休眠时间结束后会自动恢复,线程回到就绪状态。

wait()是Object类的方法,调用对象的wait。方法导致当前线程放弃对象的锁(线

程暂停执行),进入对象的等待池(waitpool),只有调用对象的notify。方法

(或notifyAIQ方法)时才能唤醒等待池中的线程进入等锁池(lockpool),如果

线程重新获得对象的锁就可以进入就绪状态

8.简述synchronized关键字的用法。

答题要点:

synchronized关键字主要有以下这3种用法:

修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁

修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象

的锁

修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给

定对象的锁。

9.简述线程的基本状态以及状态之间的关系。

答题要点:

(1)NEW(新建状态),new语句创建的线程对象处于新建状态。

(2)RUNNABLE(可运行状态和运行状态),当一个线程对象创建后,其他线程

调用它的start。方法,该线程就进入可运行状态。处于这个状态的线程一旦得到

CPU的使用权就处于运行状态,执行程序代码。在并发运行环境中,如果计算机

只有一个CPU,那么任何时刻只会有一个线程处于这个状态。只有处于可运行状

态的线程才有机会转到运行状态。

(3)BLOCKED(阻塞状态),阻塞状态是线程等待锁的状态当线程刚进入可运

行状态(注意,还没运行),发现将要调用的资源被synchronized(同步),获

取不到锁标记,将会立即进入锁池状态,等待获取锁标记进入同步代码块/方法

或调用wait()方法后重新进入需要竞争锁。一旦线程获得锁标记后,就转入可运

行状态,等待OS分配CPU时间片。线程从阻塞状态只能进入就绪状态,无法直

接进入运行状态。

(4)WAITING(等待状态),一个线程在等待另一个线程执行动作时处于该状

心太、0

(5)TIMED_WAITING(超时等待状态),线程等待指定时间,进入超时等待状态。

该状态即停止当前线程,但并不释放所占有的资源。

(6)死亡状态,当线程执行完run()方法中的代码,或者遇到了未捕获的异常,

就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。

lOJava中你怎样唤醒一个阻塞的线程?

答题要点:

使用sleepQ方法、join。方法、wait()和notify()方法

11.简述volatile和synchronized的区别

答题要点:

(1)volatile通过变量的可见性,指定线程必须从主存中读取变量的最新值;

synchronized通过阻塞线程的方式,只有当前线程能访问该变量,锁定了当前变

量。

(2)volatile使用在变量级别;synchronized可以使用在变量、方法、类级别

(3)volatile不会造成线程阻塞;synchronized可能会造成线程阻塞

(4)volatile不能保证原子性;synchronized能保证原子性

(5)volatile标记的变量不会被编译器优化;synchronized标记的变量有可能会

被编译器优化(指令重排)。

四、程序阅读题

五、Java程序员面试题

1.简述synchronized和Lock的区别。

答题要点:

类别synchronizedLock

存在层次Java的关键字,在JVM层面上是一个类

锁的释放已获取锁的线程执行完同步代码,释放发生异常时候,不会主动

锁;在线程发生异常时,JVM会让线程释放锁。finally中释放锁,

自动释放占有的锁。避免死锁的发生。

锁的获取假设A线程获得锁,B线程等待。如果有多个获取锁的方式。可

A线程阻塞,B线程一直等待。以尝试获取锁,线程可以

不用一直等待。

锁状态无法判断可以判断

锁类型悲观锁机制,即线程获得的是独占锁乐观锁

用法区别在需要同步的对象中加入此控制,一般使用ReentrantLock

synchronized可以加在方法上,也可以类做为锁。在加锁和解锁

加在特定代码块中,括号中表示需要锁处需要通过lock。和

的对象。unlock。显示指出。所以

一般会在finally块中写

unlock。以防死锁。

性能区别少量同步大量同步

synchronize是性能低效的。因为这是一当竞争资源非常激烈时

个重量级操作,需要调用操作接口,导(即有大量线程同时竞

致有可能加锁消耗的系统时间比加锁争),此时Lock的性能

以外的操作还多。要远远优于

synchronizedo

用途区别可重入,不可中断,非公平可重入,可中断,可公平

调度机制使用Object对象本身的wait、notify.使用Condition进行线程

notifyAII调度机制之间的调度

2.什么是线程池(threadpool)?简要说明ThreadPoolExecutor的策略。

答题要点:

服务端应用程序(如数据库和Web服务器)需要处理来自客户端的高并发、耗

时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常

消耗资源的操作。过于频繁的创建/销毁线程,会

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论