zoukankan      html  css  js  c++  java
  • java 多线程 29 :多线程组件之 Exchanger

    Exchanger

    Exchanger,从名字上理解就是交换。Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换。线程会阻塞在Exchanger的exchange方法上,直到另外一个线程也到了同一个Exchanger的exchange方法时,二者进行数据交换,然后两个线程继续执行自身相关的代码。

    Exchanger只有一个exchange方法,用于交换数据。看一下例子:

    public static class ExchangerThread extends Thread
    {
        private String str;
        private Exchanger<String> exchanger;
        private int sleepSecond;
        
        public ExchangerThread(String str, Exchanger<String> exchanger, int sleepSecond)
        {
            this.str = str;
            this.exchanger = exchanger;
            this.sleepSecond = sleepSecond;
        }
            
        public void run()
        {
            try
            {
                System.out.println(this.getName() + "启动, 原数据为" + str + ", 时间为" + System.currentTimeMillis());
                Thread.sleep(sleepSecond * 1000);
                str = exchanger.exchange(str);
                System.out.println(this.getName() + "交换了数据, 交换后的数据为" + str + ", 时间为" + System.currentTimeMillis());
            } 
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
        
    public static void main(String[] args)
    {
        Exchanger<String> exchanger = new Exchanger<String>();
        ExchangerThread et0 = new ExchangerThread("111", exchanger, 3);
        ExchangerThread et1 = new ExchangerThread("222", exchanger, 2);
        et0.start();
        et1.start();
    }

    看一下运行结果:

    Thread-0启动, 原数据为111, 时间为1444560972303
    Thread-1启动, 原数据为222, 时间为1444560972303
    Thread-0交换了数据, 交换后的数据为222, 时间为1444560975303
    Thread-1交换了数据, 交换后的数据为111, 时间为1444560975303

    看到两个线程交换了数据,由于一个线程睡2秒、一个线程睡3秒,既然要交换数据,肯定是睡2秒的要等待睡3秒的,所以看到时间差是3000ms即3s。


    ps:这里感觉是,一个线程需要另一个线程跟他同步的时候  会用到 ,也可用作管道相互通知,先mark

  • 相关阅读:
    题解 nflsoj204 排列
    题解 CF1328 D,E,F Carousel, Tree Queries, Make k Equal
    题解 LOJ3277 「JOISC 2020 Day3」星座 3
    题解 nflsoj464 CF1267K 正睿1225:一个简单的计数技巧
    题解 CF1326F2 Wise Men (Hard Version)
    题解 CF1326E Bombs
    题解 CF1316E and UOJ495:一类结合贪心的背包问题
    仓鼠的DP课 学习笔记
    题解 CF1314B Double Elimination
    固件
  • 原文地址:https://www.cnblogs.com/signheart/p/6098ec11e9ea8accba466054d716f65d.html
Copyright © 2011-2022 走看看