您的位置:首页 > 大数据 > 人工智能

sleep()与wait()之间的不同

2015-12-02 19:27 555 查看
sleep()方法用来阻塞进程一定时间,这个时间可以自己来指定,wait()方法会使线程进入等待状态,并且它不能自动恢复,只有调用了notify()或者notifyAll()之后才能继续执行。

最主要的不同是wait()释放了锁或者控制器,但是sleep()在等待的过程中没有释放任何的锁或者控制器。一般情况下,wait()用于线程间的通信,sleep()用于暂停程序的执行。

Thread.sleep()使当前线程在一定时间内进入”不可运行”状态,并且线程会保持它所获取的控制器或者锁。例如:如果Thread.sleep()当前处于一个synchronized块中或者方法中,那么另一个线程是不能进入这个synchronized块或者方法。如果另外一个线程调用t.interrupt(),它将唤醒这个休眠线程。值得注意的是,sleep()是一个静态方法,这意味着它总会影响当前运行了sleep()方法的线程。一个常见的错误是在另一个线程中调用t.sleep(),这样使用也只会使当前进程进行休眠,而不是t这个线程。

object.wait()也是使当前线程进入”不可运行“状态,但是不同的是,Wait是被一个对象调用,不是一个线程;我们称这个对象为”锁对象“。lock.wait()必须放在synchronized块中,并且使用这个”锁对象“当做对象锁。wait()执行之后,就会释放这个锁,并且将当前线程加入到跟这个锁相关联的”等待列表“中。之后,另一个线程就可以异步的使用这个锁对象,并且调用lock.notify(),它会唤醒之前那个等待的线程。一般情况下,wait()/notify() 类似于sleep()/interrupt()。

synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}

synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}


下面从以下几个方面进行讨论。

调用:

wait():被一个对象调用,并且必须在synchronized块中,锁对象就是调用对象。

sleep():被一个线程调用,总是使当前执行线程休眠。

Synchronized:

wait(): 同步多线程一个接一个访问同一个对象。

sleep():同步多线程访问的时候,必须sleep()休眠完成之后,才能访问。

唤醒状态:

wait():直到调用对象的notify(), notifyAll()方法。

sleep():直到休眠时间结束或者调用interrupt()。

使用:

sleep(): 作为时间异步

wait():作为多线程异步

原文:Difference between sleep() and wait()?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: