sleep synchronized wait notify notifyAll

来源:互联网 发布:剑网三谢云流捏脸数据 编辑:程序博客网 时间:2024/04/29 04:24

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的线程继续工作。