https://blog.csdn.net/jisuanji12306/article/details/86363390
首先,线程之间通信的模型有两种:共享内存和消息传递,一下方式都是基于这两种来实现。
题目:有两个线程A和B,A线程向一个集合里面依次添加元素,”abc”字符串,一共添加十次,当添加到第五次的时候,希望线程B能够收到A线程的通知,然后B线程执行相关的业务操作。
方式一、使用volatile关键字
基于volatile关键字来实现线程间相互通信,是使用共享内存的思想,大致意思是多个线程同时监听一个变量,当这个变量发生变化的时候,线程能够感知并执行相应的业务,这也是最简单的一种实现方式。
代码如下:
package com.work; import java.util.ArrayList; import java.util.List; public class ComByVolatile { //定义一个共享变量来实现通信,它需要是volatile修饰,否则线程不能及时感知 static volatile boolean notice = false; // static boolean notice = false; public static void main(String[] args) { List<String> list = new ArrayList<String>(); Thread threadA = new Thread(()->{ for (int i = 1;i<=10;i++){ list.add("abc"); System.out.println("线程A向list中添加一个元素,此时list中元素的个数为:"+list.size()); try{ Thread.sleep(500); }catch (InterruptedException e){ e.printStackTrace(); } if (list.size() == 5){ notice = true; } } }); Thread threadB = new Thread(()->{ while (true){ if (notice){ System.out.println("线程B收到通知,开始自行自己的业务"); break; } } }); //线程B需要先启动 threadB.start(); try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } //再启动A线程 threadA.start(); } }
输出结果为:
线程A向list中添加一个元素,此时list中元素的个数为:1 线程A向list中添加一个元素,此时list中元素的个数为:2 线程A向list中添加一个元素,此时list中元素的个数为:3 线程A向list中添加一个元素,此时list中元素的个数为:4 线程A向list中添加一个元素,此时list中元素的个数为:5 线程A向list中添加一个元素,此时list中元素的个数为:6 线程B收到通知,开始自行自己的业务 线程A向list中添加一个元素,此时list中元素的个数为:7 线程A向list中添加一个元素,此时list中元素的个数为:8 线程A向list中添加一个元素,此时list中元素的个数为:9 线程A向list中添加一个元素,此时list中元素的个数为:10
方式二:使用Object类的wait()和notify()
中所周知,Object类提供了线程之间通信的方法,wait()和notify(),notifyAll(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。
注意:wait和notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁。
代码如下:
输出