2.3 Exchanger的理解和使用

 快速理解:一個線程在執行exchange(set)之後,會等待另一個線程執行exchange(set),然後兩個線程繼續往下執行

圖解

 示例代碼:交換數據

public class UseExchange {
    private static final Exchanger<Set<String>> exchange = new Exchanger<Set<String>>();

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                Set<String> setA = new HashSet<String>();//存放數據的容器
                try {
                    Thread.currentThread().setName("setA:");
                    System.out.println("setA原來是:a,b,c,d");
                    //添加數據
                    setA.add("a");
                    setA.add("b");
                    setA.add("c");
                    setA.add("d");
                    Thread.sleep(1000);
                    setA = exchange.exchange(setA);//交換set

                    System.out.println("交換之後" + Thread.currentThread().getName() + setA.toString());

                    /*處理交換後的數據*/
                } catch (InterruptedException e) {
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                Set<String> setB = new HashSet<String>();//存放數據的容器
                Thread.currentThread().setName("setB:");
                System.out.println("setB原來是:1,2,3,4");
                try {
                    //添加數據
                    setB.add("1");
                    setB.add("2");
                    setB.add("3");
                    setB.add("4");
                    setB = exchange.exchange(setB);//交換set
                    System.out.println("交換之後" + Thread.currentThread().getName() + setB.toString());
                    /*處理交換後的數據*/
                } catch (InterruptedException e) {
                }
            }
        }).start();
    }
}

執行結果:

setA原來是:a,b,c,d
setB原來是:1,2,3,4
交換之後setA:[1, 2, 3, 4]
交換之後setB:[a, b, c, d]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章