Exchanger 线程之间交换数据

Exchanger是用于线程之间交换数据的工具类,它提供一个同步点,在这个同步点,两个线程可以彼此交换数据。这两个线程通过exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

注意:Exchanger只能在两个线程之间交换数据,不支持更多的线程。

当线程A调用了Exchanger对象的exchange()方法后,会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

如果两个线程有一个没有执行exchange方法(),则会一直等待,如果担心有特殊情况发生,避免一直等待,可以使用exchange(V X ,long timeout,TimeUnit unit)设置最大等待时间。

public class MyExchanger {
    public static void main(String[] args){
            Exchanger<List<String>> exchanger=new Exchanger<List<String>>();
            new Producer(exchanger).start();
            new Consumer(exchanger).start();
    }
}
class Producer extends Thread{
    List<String> list=new ArrayList<String>();
    Exchanger<List<String>> exchanger=null;
    public Producer(Exchanger<List<String>> exchanger){
        this.exchanger=exchanger;
    }
    @Override
    public void run() {
        super.run();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        list.add("ff");
        try {
            list= exchanger.exchange(list);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
class Consumer extends Thread{
    List<String> list=new ArrayList<String>();
    Exchanger<List<String>> exchanger=null;
    public Consumer(Exchanger<List<String>> exchanger){
        this.exchanger=exchanger;
    }
    @Override
    public void run() {
        super.run();
        try {
            list=  exchanger.exchange(list);
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qiuhao9527/article/details/80776435