zoukankan      html  css  js  c++  java
  • java Concurrent包学习笔记(六):Exchanger

    一、概述

    Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据。

    二、示例程序

    package exchanger.demo;
    
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @author boshen
     * @date 2018/12/20
     */
    public class ExchangerTest {
        class StudentThread implements Runnable{
            private String data;
            private Exchanger exchanger;
            StudentThread(String data, Exchanger exchanger){
                this.data = data;
                this.exchanger = exchanger;
            }
            public void run(){
                try {
                    System.out.println(Thread.currentThread().getName()+":准备交换给对方的数据:" + data);
                    String newData = exchanger.exchange(data).toString();
                    System.out.println(Thread.currentThread().getName()+":收到对方的数据:" + newData);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args){
            ExchangerTest cb = new ExchangerTest();
            Exchanger exchanger = new Exchanger();
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.submit(cb.new StudentThread("张三",exchanger));
            executorService.submit(cb.new StudentThread("李四",exchanger));
            executorService.submit(cb.new StudentThread("王五",exchanger));
            executorService.submit(cb.new StudentThread("马六",exchanger));
            executorService.submit(cb.new StudentThread("赵七",exchanger));
            executorService.shutdown();
        }
    }

    执行结果:

    pool-1-thread-2:准备交换给对方的数据:李四
    pool-1-thread-1:准备交换给对方的数据:张三
    pool-1-thread-1:收到对方的数据:李四
    pool-1-thread-3:准备交换给对方的数据:王五
    pool-1-thread-2:收到对方的数据:张三
    pool-1-thread-4:准备交换给对方的数据:马六
    pool-1-thread-4:收到对方的数据:王五
    pool-1-thread-5:准备交换给对方的数据:赵七
    pool-1-thread-3:收到对方的数据:马六

    从以上可知:1和2相互交换了数据,3和4交换了数据,但是5一直在等待将数据交换给对方。因为Exchanger交换数据重点是在成对的线程之间,所以5没有交换同伴。

  • 相关阅读:
    捕获控制台输出信息
    .net 值类型变量赋值需要注意
    《河北省实施〈中华人民共和国道路交通安全法〉办法》
    在Win7应用程序中使用盾牌图标
    32位WIndows 7的“快速启动”,重启后丢失的问题,被确认是一个bug
    在本地网页中,让flash可以访问本地文件
    WPF 3D编程中,摄像机的位置很重要
    让Windows7任务栏图标显示Windows菜单(恢复,最小化,关闭)
    Joomla 书籍
    Joomla! 1.5 Template Toolbar简化Joomla模板做成的工具
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/10193923.html
Copyright © 2011-2022 走看看