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();
        }
    }

}
View Code
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();
        }
    }
}
View Code
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");
    }
}
View Code

 

posted @ 2019-12-15 16:08  弱水三千12138  阅读(456)  评论(0)    收藏  举报