java程序设计试题库 下载本文

《Java语言程序设计基础教程》

45

D、实现java.lang.Runnable接口,实现run方法。 E、实现java.lang.Thread类,实现start方法。 解答:A,D

3、 线程在它的一个完整的生命周期中有哪4种状态? 解答1:

线程在它的一个完整的生命周期中通常要经历如下的4种状态:1. 创建状态(new Thread) 2. 可运行状态( Runnable ) 3. 不可运行状态(Not Runnable)4. 死亡状态(Dead)

解答2:

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

4、线程在什么状态时,调用isAlive()方法返回的值是false。

5、建立线程有哪两种方法?

解答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。

6、怎样设置线程的优先级?

7、调用Thread类的什么方法可以启动一个线程?直接调用Thread类的run()方法可以启动一个线程吗?

解答:线程调用start()方法将启动线程,从新建状态进入就绪队列排队。不能直接调用Thread类的run()方法可以启动一个线程,我们调用了Thread的run()方法,它的行为就会和普通的方法调用一样。

8、Thread 类中的start() 和 run() 方法有什么区别?

解答:这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()

45

46

《Java语言程序设计基础教程》

方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

9、进程和线程的区别?

解答:进程=执行中的程序,每个进程都有自己独立的一块内存、一组系统资源。每一个进程的内部数据和状态都是完全独立的。

线程=进程中单个顺序的流控制,同类的多个线程共享一块内存、一组系统资源。线程的运行开销很小。

一个线程是进程的一个执行流程,一个进程可以同时包含多个线程。

10、现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

解答:在T2线程的run()方法中加入代码T1.join,在T3线程的run()方法中加入代码T2.join。

或者在主线程main()方法中, t1.start(); try {

t1.join();

} catch (InterruptedException e) {

// TODO Auto-generated catch block e.printStackTrace(); }

t2.start(); try {

t2.join();

} catch (InterruptedException e) {

// TODO Auto-generated catch block e.printStackTrace(); }

t3.start();

11、Thread.start()与Thread.run()有什么区别?

解答:通过调用Thead类的start()方法来启动一个线程 ,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。 直接使用run()方法叫做方法调用,不能启动线程。

12、在一个对象上两个线程可以调用两个不同的同步实例方法吗?

解答:不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有执行完该方法释放对象锁后才能执行其 它同步方法。

46

《Java语言程序设计基础教程》

47

13、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?

解答:可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Java没有为非同步方法做任何检查,锁对象仅 仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,所以在这种情况下要特 别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

14、wait方法的作用?

解答:wait方法用在 synchronized 方法或者 synchronized块中。一般在判断语句中,如果某条件被触发,让当前线程wait并释放对象的锁。此时可以让其他线程可以对用以对象调用synchronized方法。直到调用 notify或者notifyAll后 wait的线程才有可能执行。所以一般wait 和 notify是成对出现的。

15、启动一个线程是用run()还是start(),调用的时候有什么区别?(同第8题)

解答:当然是start()了,当调用线程的start()方法的时候,线程就会进入到就绪状态。run()方法是线程的执行入口,当线程从就绪状态进入到执行状态时首先要从run()方法开始执行。

当然,我们也是可以直接通过线程对象调用该对象的run()方法的,只是这只是一次普通的调用,并没有启动任何一个线程。

当我们调用start()方法时,是另外启动了一个线程去执行线程类的代码,并不影响主程序的执行,但是调用run()方法的时候要等待run()方法内的代码执行完主程序才可以向下执行

16、 sleep() 和 wait() 有什么区别?

解答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

7.4综合题

14、编写一个死锁程序?

15、在下面的代码区填入相应的代码,实现以下功能:

通过继承Thread类的子类Thread1,来创建和启动一个线程t1;

47

48

《Java语言程序设计基础教程》

通过实现Runnable接口的具体类Runner1,来创建和启动一个线程t2; public class TestThread1{ public static void main(String[] args){

//创建和启动一个线程t1,在下面写出相应代码 Thread1 t1 =new Thread1 () ; t1.start() ;

//创建和启动一个线程t2,在下面写出相应代码 Runner1 r1 =new Runner1() ; Thread t2 =new Thread(r1) ; t2.start() ; for(int i=0;i<100;i++){ System.out.println(\ } } }

class Runner1 implements Runnable{ public void run(){ for(int i=0;i<100;i++){ System.out.println(\ } } }

class Thread1 extends Thread{ public void run(){ for(int i=0;i<100;i++){ System.out.println(\ } } }

16、现在有T1 T2 T3三个线程,怎样保证T2在T1执行完之后执行 T3在T2执行完之后执行。请在相应区域写出实现该功能的代码。

public class JoinDemo {

public static void main(String[] args) { T1 t1=new T1(\

48