Thread的wait和notify
- 2019 年 12 月 19 日
- 筆記
Thread的wait和notify
当不同线程之间需要通信时,就要使用到wait和notify这两个方法
wait的作用
让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
nofity
唤醒等待队列中的某个线程,如果时多个线程同时等待并不能指定唤醒某个线程,这有CPU来决定
notifyAll
这个方法则是唤醒等待队列中的所有线程
实践
实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束
代码
package cn.dhbin; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * 实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中, * 线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束 * 使用Thread的wait和notify实现 * * @author dhb */ public class Container1 { /** * 容器 */ private volatile List<Object> list = new ArrayList<>(); public void add(Object obj) { list.add(obj); } public int size() { return list.size(); } public static void main(String[] args) throws InterruptedException { Container1 c = new Container1(); Object lock = new Object(); /* * 监控大小的线程必须先执行,因为如果添加元素线程先执行的话,添加元素线程 * 取到了锁并不释放,监控大小的线程就无法加入while块 * */ new Thread(() -> { synchronized (lock) { while (c.size() != 5) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("容器到达5个,结束"); // 唤醒添加元素线程 lock.notify(); } } }).start(); TimeUnit.SECONDS.sleep(1); new Thread(() -> { synchronized (lock) { for (int i = 0; i < 10; i++) { c.add(new Object()); System.out.println(Thread.currentThread().getName() + "---" + i); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } if (c.size() == 5) { // 通知监控大小线程,notify并不会释放锁 lock.notify(); try { // wait让出cpu,让监控大小线程执行 lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } }