zoukankan      html  css  js  c++  java
  • 线程之间通信

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

    代码如下:

    输出

  • 相关阅读:
    JSP中page和pageContext的区别
    exe4j生成的exe文件没有把jre文件也打进exe文件中
    exe4j将jar文件和jre文件打包成exe
    exe4j打包jar文件为exe文件出现的问题:The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
    JS作用域
    js 函数
    js数组
    js表达式和语句
    js操作符
    js注释和数据类型转换
  • 原文地址:https://www.cnblogs.com/LoganChen/p/14161333.html
Copyright © 2011-2022 走看看