在多线程系统中,彼此之间的通信协作非常重要,下面来聊聊线程间通信的几种方式。
wait/notify
想像一个场景,A、B两个线程操作一个共享List对象,A对List进行add操作,B线程等待List的size=500时就打印记录日志,这要怎么处理呢?
一个办法就是,B线程while (true) { if(List.size == 500) {打印日志} },这样两个线程之间就有了通信,B线程不断通过轮训来检测 List.size == 500 这个条件。
这样可以实现我们的需求,但是也带来了问题:CPU把资源浪费了B线程的轮询操作上,因为while操作并不释放CPU资源,导致了CPU会一直在这个线程中做判断操作。
这要非常浪费CPU资源,所以就需要有一种机制来实现减少CPU的资源浪费,而且还可以实现在多个线程间通信,它就是“wait/notify”机制。
定义两个线程类:
public class MyThread1_1 extends Thread { private Object lock; public MyThread1_1(Object lock) { this.lock = lock; } public void run() { try { synchronized (lock) { System.out.println(Thread.currentThread().getName() + "开始------wait time = " + System.currentTimeMillis()); lock.wait(); System.out.println(Thread.currentThread().getName() + "开始------sleep time = " + System.currentTimeMillis()); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + "结束------sleep time = " + System.currentTimeMillis()); System.out.println(Thread.currentThread().getName() + "结束------wait time = " + System.currentTimeMillis()); } } catch (InterruptedException e) { e.printStackTrace(); } } }
12-14 21:50