Thread之Exchanger

来源:互联网 发布:ubuntu 商业版 编辑:程序博客网 时间:2024/05/18 13:28

在多线程并发时设置等待,等待另一线程运行到指定位置,并且交换数据。
使用构造函数Exchanger()创建对象。
在线程开始之后可以使用exchange(Object)方法控制当前线程等待,直到有另一个线程也调用该方法时交换数据,并继续执行。(此方法只支持两个线程之间的数据交换)
类似于买卖双方约定交易地点,其中一方先到之后等待另外一方,双方到齐之后一手交钱一手交货。

package com.milton.thread.util;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * @author milton * */public class ExchangerTest {    public static void main(String[] args) {        ExecutorService pool = Executors.newCachedThreadPool();        final Exchanger<String> exchanger = new Exchanger<String>();        pool.execute(new Runnable() {            @Override            public void run() {                try {                    String data1 = "zs";                    System.out.println("线程" + Thread.currentThread().getName()+ "把数据{" + data1 + "} 换出去");                    String data2 = exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName() + "交换回来的数据为{" + data2 + "}");                    TimeUnit.SECONDS.sleep((long) (Math.random() * 1000));                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        pool.execute(new Runnable() {            @Override            public void run() {                try {                    String data1 = "ls";                    System.out.println("线程" + Thread.currentThread().getName()  + "把数据{" + data1 + "}换出去");                    String data2 = exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName()+ "交换回来的数据为{" + data2 + "}");                    TimeUnit.SECONDS.sleep((long) (Math.random() * 1000));                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });    }}

执行结果:
线程pool-1-thread-1把数据{zs} 换出去
线程pool-1-thread-2把数据{ls}换出去
线程pool-1-thread-1交换回来的数据为{ls}
线程pool-1-thread-2交换回来的数据为{zs}

0 0
原创粉丝点击