sleep 和 wait 方法都是可以让线程停一停的方法
sleep 是 Thread 的静态方法 , wait是Object的方法
由于sleep 是Thread的静态方法, sleep是让当前线程停一停。
调用对象的wait方法时, 当前线程必须已经拥有该对象的monitor (monitor 在很多资料的文档里面翻译很看不懂, Java编程思想将其翻译为对象锁)。 表现在代码上就是:
synchronized (obj) {
while ()
obj.wait(timeout);
... // Perform action appropriate to condition
}
也就是说, wait方法调用的地方必须被同步块包围, 同步块的参数正是调用wait方法的对象。
wait方法被调用后, 当前线程也就暂停了下来, 同时, 该对象的所有同步锁被释放。针对这一句我的理解是, 假设有两个同步块
A)
synchronized (obj) {
... // Do some thing
}
B)
synchronized (obj) {
... // Do some thing
}
当前线程进入到同步块A时, 其它线程是不能进到同步块B的。 但是, 如果同步块里面包含有一句
obj.wait();
那么, 当前线程进入到同步块A并且执行到obj.wait();这一句时, 其它线程可以进到同步块B。
synchronized (obj) {
obj.wait();
... // Do some thing //当执行到这一句时, 实际上同步块的意义就不大了?
}
obj.notify方法会让唤醒其中一个wait的线程继续工作, 而obj.notifyAll方法会唤醒所有在obj上wait的线程继续工作。