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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章