17_张孝祥_多线程_同步工具Exchanger

来源:互联网 发布:犀牛软件基础教程 编辑:程序博客网 时间:2024/05/16 06:47

可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。

构造方法摘要
Exchanger() 创建一个新的 Exchanger。

方法摘要

CountDownLatch CyclicBarrier V exchange(V x) 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。 V exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

代码示例
交换操作必须是成双成对的,如果线程是奇数操作,那么两个会交换成功,另一个会一直等待交换。

import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExchangerTest {    public static void main(String[] args) {        ExecutorService service = Executors.newCachedThreadPool();        final Exchanger<String> exchanger = new Exchanger<String>();        service.execute(new Runnable() {            public void run() {                try {                    String data1 = "zxx";                    System.out.println("线程" + Thread.currentThread().getName()                            + "正在把数据" + data1 + "换出去");                    Thread.sleep((long) Math.random() * 10000);                    String data2=(String) exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName()                            + "换回的数据为" + data2);                } catch (Exception e) {                    e.printStackTrace();                }            }        });        service.execute(new Runnable() {            public void run() {                try {                    String data1 = "lhm";                    System.out.println("线程" + Thread.currentThread().getName()                            + "正在把数据" + data1 + "换出去");                    Thread.sleep((long) Math.random() * 10000);                    String data2=(String) exchanger.exchange(data1);                    System.out.println("线程" + Thread.currentThread().getName()                            + "换回的数据为" + data2);                } catch (Exception e) {                    e.printStackTrace();                }            }        });        service.shutdown();    }}