Thread wait & sleep

Thread wait

线程等待(Waiting) 是线程的状态之一。通过 Thread.wait() 进入等待状态的线程会自动放弃 对象锁(Monitor),然后进入线程等待状态。当其他线程调用 notify()notifyAll() ,等待线程进入可运行状态(Runnable),等待 CPU 调度。线程的一生介绍了线程状态间切换的过程。

调用 Object.wait() 前,必须已经获取了对象锁,否则将抛出 IllegalMonitorStateException

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Demo {
private final Object lock = new Object();

public void badUsage() {
// will throw IllegalMonitorStateException
lock.wait();
}

public void goodUsage() {
synchronized (lock) {
lock.wait();
}
}
}

Thread sleep

处于 sleep 的线程也进入 等待 状态。与 Thread.wait() 不同是:线程不会因为 sleep 而放弃对象锁。当然,在任何情况下都可以调用 Thread.sleep() 方法,即使是未获得任何对象锁的前提下。

处于 sleep 下的线程,可能被其他线程中断(Interrupt),中断响应后将抛出 InterruptedException何时需要线程中断中介绍了更多中断的内容。

Thread await

wait() 方法属于 Object 类,await() 方法属于 Condition 类。

两者都是需要在获取锁的前提下调用,调用成功后放弃锁。前者获取对象锁,后者获取显式锁(Java 中 Lock 的实现类)。

Object.notify() 随机唤醒一个等待线程,Condition.signal() 唤醒指定的等待线程。这是使用上最大的不同。