> 电器
java线程之间如何进行通信(java线程之间如何共享数据)
导语:java线程之 wait、notify/notifyAll 详解
wait notify 原理
API 介绍
1、obj.wait() 让进入 object 监视器的线程到 waitSet 等待;
2、obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒;
3、obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒;
注意:线程调用wait或者notify的时候,必须要先获取到该对象的锁,也就是wait和notify必须写在synchronized里面,不然会出现 IllegalMonitorStateException(非法的监控状态) 异常;如下图:
我们可以这么理解,monitor是一个房子,waitSet和EntryList是两个休息室,我们要进入这两个休息室,那么一定要先进入这个房子,只有房子的主人才可以进入这个房子。只有获得房子锁的人才可以进入。
wait notify 的区别
1) sleep 是 Thread 方法,而 wait 是 Object 的方法
2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要 和 synchronized 一起用
3) sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁
4) 它们 状态 TIMED_WAITING
以下代码演示sleep不会释放锁;
以上代码:t1线程先获取到锁,应为main线程睡眠了1秒后再获取锁,t1线程获取到锁后就进入睡眠10秒钟,这个时候main线程已经获取不到锁了,必须等待10秒钟后才可以获取锁,所以sleep是不会释放对的锁。
本文内容由小美整理编辑!