在多线程系统中,彼此之间的通信协作非常重要,下面来聊聊线程间通信的几种方式。

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