Java concurrent包下的并发开发辅助类(四)Exchanger

测试代码:

public class ExchangerSample {

    public static void main(String[] args) {
        Exchanger exchanger = new Exchanger<>();
        ExchangerThread thread1 = new ExchangerThread(exchanger, "abc");
        ExchangerThread thread2 = new ExchangerThread(exchanger, "def");
        thread1.start();
        thread2.start();
    }
}

class ExchangerThread extends Thread {

    private Exchanger exchanger;

    private String mydata;

    public ExchangerThread(Exchanger exchanger, String mydata) {
        this.exchanger = exchanger;
        this.mydata = mydata;
    }

    @Override
    public void run() {
        System.out.println(getName() + " mydata: " + mydata);
        try {
            String exchange = exchanger.exchange(mydata);

            System.out.println(getName() + " exchange: " + exchange);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

Thread-0 mydata: abc
Thread-1 mydata: def
Thread-1 exchange: abc
Thread-0 exchange: def

Exchanger,可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。

1.构造方法Exchanger() 创建一个新的 Exchanger。
2.exchange(V x)
等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
3.exchange(V x, long timeout, TimeUnit unit)
等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致。

你可能感兴趣的:(Java并发与多线程)