线程之间通信

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方法不释放锁。

代码如下:

 

 

输出

posted @ 2020-12-19 21:39  alittlecomputer  阅读(128)  评论(0编辑  收藏  举报