Thread wait & sleep
Thread wait
线程等待(Waiting) 是线程的状态之一。通过 Thread.wait()
进入等待状态的线程会自动放弃 对象锁(Monitor),然后进入线程等待状态。当其他线程调用 notify()
或 notifyAll()
,等待线程进入可运行状态(Runnable),等待 CPU 调度。线程的一生介绍了线程状态间切换的过程。
调用 Object.wait()
前,必须已经获取了对象锁,否则将抛出 IllegalMonitorStateException。
1 | public class Demo { |
Thread sleep
处于 sleep 的线程也进入 等待 状态。与 Thread.wait()
不同是:线程不会因为 sleep 而放弃对象锁。当然,在任何情况下都可以调用 Thread.sleep()
方法,即使是未获得任何对象锁的前提下。
处于 sleep 下的线程,可能被其他线程中断(Interrupt),中断响应后将抛出 InterruptedException。何时需要线程中断中介绍了更多中断的内容。
Thread await
wait()
方法属于 Object
类,await()
方法属于 Condition
类。
两者都是需要在获取锁的前提下调用,调用成功后放弃锁。前者获取对象锁,后者获取显式锁(Java 中 Lock
的实现类)。
Object.notify()
随机唤醒一个等待线程,Condition.signal()
唤醒指定的等待线程。这是使用上最大的不同。