线程的休眠与等待 区别(转)

关于线程间的交互和共享数据通常有轮询和通知机制。一下举例说明:Thread1和Thread2共享一块数据ShareData,Thread1使用数据,Thread2更新数据。当Thread1使用数据时发现数据没有更新就可以先休眠(sleep())一段时间然后再去判断是否更新,如此反复直到数据可用,这就是所述的轮询机制。可以看出轮询机制需要不断的轮询数据状态,很耗费资源;当采用通知机制时过程是这样的,Thread1发现数据不可用就在ShareData上等待(ShareData.wait()),当Thread2更新数据后就通知所有在ShareData上等待的线程(ShareData.notifyAll()),这样Thread1受到通知继续运行。

关于等待和休眠还有另一个区别就是当线程等待时,该线程锁定的资源是释放掉的,这时其它线程是可以锁定这些资源的,当线程被唤醒或者等待时限到时线程重新获取资源才能继续运行;而当线程休眠时线程锁定的资源是不被释放的。

还有一点就是要在对象lock上等待时是必须先要获取lock的对象锁才能进行的,即必须要类似下面的逻辑synchronized(lock){ lock.wait()}

以下为一个简单的示例:

package  sinpo.usagedemo;

/**
  * 该例子说明线程休眠与等待以及注意事项。
  * 
  *  @author  徐辛波(sinpo.xu@hotmail.com) 
  * Oct 22, 2008
  */
public class  PendingThreadDemo  {
     public  Console console =  new  Console () ;
     private  void  writeToConsole1 () {
         synchronized ( console ){
             try  {
                 Thread.sleep ( 1  *  1000 ) ; //NOTE:sleep时并未释放console别的线程是不能锁定console的
                 //TODO do things
             }  catch  ( InterruptedException e ) {
                 e.printStackTrace () ;
             }
         }
     }
    
     private  void  writeToConsole2 () {
         synchronized ( console ){
             try  {
                 console.wait ( 1 * 1000 ) ; //NOTE:wait时别的线程是可以锁定console的
                 //TODO do things
             }  catch  ( InterruptedException e ) {
                 e.printStackTrace () ;
             }
         }
     }
}
//控制台类
class  Console  {
     //TODO implements me
} 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值