Exchanger 簡單瞭解

文字摘要於:https://yq.aliyun.com/articles/632589
Exchanger(交換者)是一個用於線程間協作的工具類。Exchanger用於進行線程間的數據交換。它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數據。這兩個線程通過exchange方法交換數據,如果第一個線程先執行exchange()方法,它會一直等待第二個線程也 執行exchange方法,當兩個線程都到達同步點時,這兩個線程就可以交換數據,將本線程生產出來的數據傳遞給對方。所以由此可見,Exchanger將會與 生產者-消費者模型相關。

其應用場景有:Exchanger可以用於遺傳算法,遺傳算法裏需要選出兩個人作爲交配對象,這時候會交換 兩人的數據,並使用交叉規則得出2個交配結果。Exchanger也可以用於校對工作,比如我們需 要將紙製銀行流水通過人工的方式錄入成電子銀行流水,爲了避免錯誤,採用AB崗兩人進行 錄入,錄入到Excel之後,系統需要加載這兩個Excel,並對兩個Excel數據進行校對,看看是否錄入一致。如果兩個線程有一個沒有執行exchange()方法,則會一直等待,如果擔心有特殊情況發 生,避免一直等待,可以使用exchange(V x,longtimeout,TimeUnit unit)設置最大等待時長。

使用

 public static void main(String[] args) {

        Exchanger<Object> exchanger = new Exchanger<>();

        new Thread(()-> {
            Object o = new Object();
            System.out.println("object 原先的地址 " + o.hashCode());
            try {
                Object exchange = exchanger.exchange(o);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();


        new Thread(()-> {
            Object o = new Object();

            try {
                Object exchange = exchanger.exchange(o);
                System.out.println("object 原先的地址 " + exchange.hashCode());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

測試發現,傳入和返回的地址是相同的,所以當我們使用的時候需要注意,如果刪減對象會導致接收者數據也會改變。

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