Java 多线程学习5 - 线程间通信

  1. 利用Object的notify和wait进行线程间通信

Java Object中有一组wait,notify,notifyAll方法用于线程间的通信。

public final native void notify();

public final native void notifyAll();

public final native void wait(long var1) throws InterruptedException;

public final void wait(long var1, int var3) throws InterruptedException {
     if (var1 < 0L) {
         throw new IllegalArgumentException("timeout value is negative");
     } else if (var3 >= 0 && var3 <= 999999) {
        if (var3 > 0) {
           ++var1;
        }
       this.wait(var1);
     } else {
        throw new IllegalArgumentException("nanosecond timeout value out of range");
    }
}

public final void wait() throws InterruptedException {
    this.wait(0L);
}

wait: 当没有参数时,默认一直等待其他线程调用notify、notifyAll方法,如果有参数则在超时之后,自动获得对象的monitor锁之后自动执行下面的逻辑。注意wait和notify,notifyAll这三个方法必须在获取了该对象的monitor锁的线程中执行。否则会抛出异常。
notify:唤醒该对象的wait set中的任意一个线程
notifyAll:唤醒该对象的wait set中的所有线程,这些线程争抢该对象的Monitor锁,获得锁的线程进入Runnable状态。

wait和sleep的区别:
wait和sleep都会使线程进入阻塞状态,也都可以被interrupt中断。
wait必须在拥有该对象的monitor锁的代码块中执行而sleep不用。
wait会放弃该对象的monitor锁,而sleep不会放弃锁

在做实验的过程中,调用了wait并没有调用notify方法,线程也可以自动恢复。这一点不是很理解为什么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容