併發:執行緒間交換資料的Exchanger(交換者)。
阿新 • • 發佈:2018-12-18
Exchanger是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。他提供一個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料,如果第一個執行緒先執行exchange()方法,他會一直等待第二個執行緒也執行exchange方法,當兩個執行緒都達到同步點時,這兩個執行緒就可以交換資料,將本執行緒生產出來的資料傳遞給對方。
下面來看一下Exchanger的應用場景。
Exchanger可以用於遺傳演算法,遺傳演算法裡需要選出兩個人作為交配物件,這時候會交換兩人的資料,並使用交叉規則得出2個交配結果。Exchanger也可以用於校對工作,比如我們需要將紙質銀行流水通過人工的方式錄入成電子銀行流水,為了避免錯誤,採用AB崗兩人進行錄入,錄入到Excel之後,系統需要載入這兩個Excel,並對兩個Excel資料進行校對,看看是否錄入一致,程式碼如下所示。
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"; // A 錄入銀行流水資料 exgr.exchange(A); } catch (InterruptedException e) { e.printStackTrace(); } } }); threadPool.execute(new Runnable() { @Override public void run() { try { String B = "銀行流水B"; // B 錄入銀行流水資料 String A = exgr.exchange("B"); System.out.println("A和B資料是否一致:"+A.equals(B)+",A錄入的是:"+A+",B錄入的是:"+B); } catch (InterruptedException e) { e.printStackTrace(); } } }); threadPool.shutdown(); } }
如果兩個執行緒有一個沒有執行exchange()方法,則會一直等待,如果擔心有特殊情況發生,避免一直等待,可以使用exchange(V x, long timeout, TimeUnit unit)設定最大等待時長。