一、概述
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没有交换同伴。