第九章考试题
一、选择题:(每题3分,共60题)
1. 下列关于Java线程的说法那些是正确的( D )。
A、每一个Java线程可以看成由代码、一个真实的CPU以及数据三部份组成。 虚拟CPU B、创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题。
C、Thread类属于java.util程序包。 Lang包 D、以上说法无一正确。
2. 运行下列程序, 会产生什么结果?
public class X extends Thread implements Runable{ public void run(){
System.out.println(\ }
public static void main(String args[]) { Thread t=new Thread(new X()); t.start(); }
}
( D )。
A、第一行会产生编译错误 B、第六行会产生编译错误 C、第六行会产生运行错误 D、程序会运行和启动
3. 下面哪个方法不可以在任何时候被任何线程调用?( D )
A、wait() B、sleep() C、yield() D、synchronized(this) 4. 下列关于线程优先级的说法中,正确的是( D )。
A、线程的优先级是不能改变的
B、线程的优先级是在创建线程时设置的 C、在创建线程后的任何时候都可以设置 D、B和C
5. 线程生命周期中正确的状态是( C )。
A、新建状态、运行状态和终止状态
B、新建状态、运行状态、阻塞状态和终止状态 C、新建状态、可运行状态、运行状态、阻塞状态和终止状态 D、新建状态、可运行状态、运行状态、恢复状态和终止状态 6. Thread类中能运行线程体的方法是( )。
A、start() B、resume() C、init() D、run()
7. 在线程同步中, 为了唤醒另一个等待的线程,使用下列方法( C )。
A、sleep()
B、wait()
C、notify() notifyall() D、join()
8. 为了得到当前正在运行的线程,可使用下列哪个方法?( B )。
A、getName() B、Thread.CurrentThread() C、 sleep() D、run() 9. 以下( D )不属于线程的状态。
A、就绪状态 B、运行状态 C、挂起状态 D、独占状态 10. 当线程被创建后,其所处的状态是( D )。
A、阻塞状态 B、运行状态 C、就绪状态 D、新建状态
11. Thread.sleep()方法调用后,当等待时间未到,该线程所处状态为( A )。
A、阻塞状态 如果时间未到不能得到CPU的运行权 B、运行状态 C、就绪状态 E、新建状态
12. wait()方法首先是哪个类的方法?( A )。
A、Object B、Thread C、Runnable D、File
13. 下列关于Thread类提供的线程控制方法的说法中,错误的一项是(C )。
A、在线程A中执行线程B的join()方法,则线程A等待直到B执行完成。 B、线程A通过调用interrupt()方法来中断其阻塞状态。
C、若线程A调用方法isAlive()返回值为true,则说明A正在执行中。也可能是可运行状态
D、currentThread方法返回当前线程的引用。 14. 下列说法中,正确的一项是( D )
A、由同一类创建的多个线程都同时运行结束。 B、创建线程只能通过继承java.lang.Thread类。
C、调用suspend()方法暂停的一个线程将不会再被重新执行。 D、程序的执行完毕与超极线程无关。 15. 下列说法错误的一项是( B)。
A、共享数据的所有访问都必须使用synchronized加锁 。 B、共享数据的访问不一定全部使用synchronized加锁。
C、所有的共享数据的访问都是临界区。 D、临界区必须使用syschronized标识。 16. 下列不是进程组成部分的一项是( D )。 A、代码 B、数据 C、内核状态 D、显示器 17. 下列你不属于线程组成部分的是:( C )。
A、程序计数器 B、堆栈
C、进程的十空间中的代码 D、栈指针
18. 下列说法正确的是( A )
A、代码和数据都是进程的组成部分
B、代码和数据是线程的组成部分 C、进程是轻型的线程 D、线程中包括进程
19. 下列说法错误的一项是( C )
A、Java的纯种体由Thread类的run方法定义。 B、线程创建时已经确定了提供线程体的对象。
C、在线程中通过调用Thread类的run()方法创建线程对象。 D、Java中每一个线程都有自己的名字。
20. 下列有关线程的叙述中正确的一项是?( B )。 A、一旦一个线程被创建,它就立即开始运行。
B、使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。 C、当一个线程因为抢占机制而停止运行时,它被放在可运行队列的前面。 D、一个线程可能因为不同的原因而终止并进入终止状态。 二、简答题:(每题8分,共计40分)
1. 线程有哪几个基本状态?它们之间如何转化?简述线程的生命周期。
java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new一个Thread或者他的子类,就创建了一个线程,此时处于新生状态 新生状态转变到就绪状态调用start方法
就绪状态一旦得到CPU就会到达运行状态,并调用自己的run方法 运行状态到阻塞状态调用sleep方法让CPU暂时中止自己进入阻塞状态
阻塞到就绪状态,等待睡眠时间到了就会到达就绪状态重新在就绪队列中等待CPU,然后获得重新运行的机会
运行到死亡(1)正常情况下线程任务完成
(2)非正常情况下线程被强制性终止如通过stop或者destroy方法执行
2. 简述程序、进程和线程之间的关系?什么是多线程程序?
程序在打开运行的时候就变成了进程,进程是由线程组成的,所谓进程,本身不能运行,它是一个资源的集合体,拥有内存,空间,模块,线程是真正的执行单元。 一个程序有多个线程任务 ,这个程序叫做多线程程序。
程序是一段代码 就是软件
进程是程序的一次动态执行过程 对应了从代码加载执行到执行完的之信息港过程 这个过程也是进程本身从产生,发展到消亡的过程
线程是比进程更小的单位,一个进程在执行过程中可能产生N多线程或者多个执行流,每个线程都有自己的产生,存在和消亡的过程。也是一个动态的概念。 多线程程序是说一个程序中包含多个执行流(线程)
3. 试简述Thread类的子类或实现Runnable接口两种方法的异同。
Runnable是接口,建议用接口方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只是需要继承Thread并且new一个实例出来,调用start方法可以启动一个线程。 实现Runnable更符合面向对象设计思想
4. 基于线程的时间管理如何实现。
TimerTask Time关系 以及如何运行一个重复执行的任务。
5. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 如果数据将在线程间共享,例如正在写的数据以后可能被另外一个线程读到,或者正在读的数据 可能已经被另外一个线程写过了,那么这些数据就是共享数据,必须进行同步存取,比如火车站售票情况,多个窗口同时售票,也必须保证票是不重复的,就得保证同步进行。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步变编程,在很多情况下采用异步更有效率。 如果数据在线程中共享,比如正在读写的数据以后可能被另外一个线程读到,或者正在读取的线程被另外一个线程写过了,那么这些数据就是共享数据 必须进行同步存取
当程序在对象上调用了一个需要花费很长时间来执行的方法并且不希望让程序等待方法的返回时候,就应该使用异步编程。