juc:工具类-Exchanger
收藏:
【死磕Java并发】—–J.U.C之并发工具类:Exchanger
Java多线程进阶(二一)—— J.U.C之synchronizer框架:Exchanger
概念
Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。
Exchanger有点类似于CyclicBarrier,我们知道CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。
Exchanger可以看成是一个双向栅栏,如下图

Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,
如果已经有其它线程(Thread2)已经到达了,就会以成对的方式交换各自携带的信息,因此Exchanger非常适合用于两个线程之间的数据交换。
用法示例
package threads.exchanger.test1; import java.util.concurrent.Exchanger; public class ThreadA extends Thread{ private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger){ super(); this.exchanger=exchanger; } @Override public void run(){ try { System.out.println("在线程A的到线程B的值="+exchanger.exchange("中国人A")); }catch (InterruptedException ex){ ex.printStackTrace(); } } }
package threads.exchanger.test1; import java.util.concurrent.Exchanger; public class ThreadB extends Thread{ private Exchanger<String> exchanger; public ThreadB(Exchanger<String> exchanger){ super(); this.exchanger=exchanger; } @Override public void run(){ try { System.out.println("在线程B中得到线程A的值=:"+exchanger.exchange("中国人B")); }catch (InterruptedException ex){ ex.printStackTrace(); } } }
package threads.exchanger.test1; import java.util.concurrent.Exchanger; public class Run { public static void main(String[] args) { Exchanger<String> exchanger=new Exchanger<String>(); ThreadA a=new ThreadA(exchanger); ThreadB b=new ThreadB(exchanger); a.start(); b.start(); System.out.println("main end"); } }

浙公网安备 33010602011771号