11.3.3 线程等待、睡眠和让步

Thread类的join方法提供了一种简单的同步方式,允许当前线程等待另外一个线程运行结束。根据之前对同步关系的介绍,如果线程A通过调用线程B的join方法等待线程B运行结束,那么在线程B中对共享变量所做的修改对于线程A是肯定可见的。一般的做法是,在线程A中创建并启动线程B之后,线程A执行另外的一些操作,接着调用join方法等待线程B完成。线程B和线程A通过修改共享变量的方式来进行交互。代码清单11-8中给出了join方法的一般使用方式。

代码清单11-8 通过join方法等待线程运行结束


public void useJoin(){

Thread thread=new Thread(){

public void run(){

try{

Thread.sleep(5000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

};

thread.start();//启动线程

//执行其他操作

try{

thread.join();//等待线程运行结束

}catch(InterruptedException e){

e.printStackTrace();

}

}


Thread类的静态方法sleep可以让当前线程进入睡眠状态一段时间。在睡眠状态下,线程的代码执行会暂停,但是线程不会释放所持有的锁。因此不要把对sleep方法的调用放在synchronized方法或代码块中,否则会造成其他等待获取锁的线程长时间处于等待状态。

如果当前线程因为某些原因无法继续执行,那么可以使用yield方法来尝试让出所占用的CPU资源,让其他线程获得运行的机会。调用yield方法对操作系统上的调度器来说是一个信号,但是调度器不一定会立即进行线程切换。调用yield方法可以使线程切换更加频繁,从而让某些与多线程相关的错误更容易暴露出来。在实际开发中调用yield方法可以作为进行测试的一个辅助手段。