Java併發工具類(4):Exchanger相關介紹

Exchanger(交換者)是一個用於線程間協作的工具類。Exchanger用於進行線程間的數據交換。它提供一個同步點,在這個同步點兩個線程可以交換彼此的數據。這兩個線程通過exchange方法交換數據, 如果第一個線程先執行exchange方法,它會一直等待第二個線程也執行exchange,當兩個線程都到達同步點時,這兩個線程就可以交換數據,將本線程生產出來的數據傳遞給對方。

Exchanger的應用場景

Exchanger可以用於遺傳算法,遺傳算法裏需要選出兩個人作爲交配對象,這時候會交換兩人的數據,並使用交叉規則得出2個交配結果。
Exchanger也可以用於校對工作。比如我們需要將紙製銀流通過人工的方式錄入成電子銀行流水,爲了避免錯誤,採用AB崗兩人進行錄入,錄入到Excel之後,系統需要加載這兩個Excel,並對這兩個Excel數據進行校對,看看是否錄入的一致。代碼如下:

package com.example.demo;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExchangerTest {
    private static final Exchanger<String> exgr = new Exchanger<String>();

    private static ExecutorService threadPool = Executors.newFixedThreadPool(2);

    public static void main(String[] args) {
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                try{
                    String A="銀行流水A";
                    exgr.exchange(A);
                }catch (InterruptedException e){}
            }
        });

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                try{
                    String B ="銀行流水B";
                    String A = exgr.exchange("B");
                    System.out.println("A和B是否一致:"+A.equals(B)+",A錄入的是:"+A+",B錄入是:"+B);
                }
                catch (InterruptedException e){

                }
            }
        });

        threadPool.shutdown();

    }
}

 

其他方法

如果兩個線程有一個沒有到達exchange方法,則會一直等待,如果擔心有特殊情況發生,避免一直等待,可以使用exchange(V x, long timeout, TimeUnit unit)設置最大等待時長。

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