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

    代码如下:

    输出

  • 相关阅读:
    Android 剪贴板操作方法在不同版本API下的使用
    Android android:persistentDrawingCache的几个默认属性值介绍
    android 4.0 external下功能库说明
    Android gc overhead limit exceeded
    android onTerminate()方法调用需要注意的点
    android onTrimMemory()和onLowMemory()
    思维游戏(3)之时间问题
    思维游戏(2)之几根蜡烛
    思维游戏之分辨姐妹(1)
    如何根据用例图写出用例描述
  • 原文地址:https://www.cnblogs.com/LoganChen/p/14161333.html
Copyright © 2011-2022 走看看