閱讀601 返回首頁    go 阿裏雲 go 技術社區[雲棲]


並發工具類(四)兩個線程進行數據交換的Exchanger

簡介

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

Exchanger的應用場景

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

01 public class ExchangerTest {
02  
03     private static final Exchanger<String> exgr = new Exchanger<String>();
04  
05     private static ExecutorService threadPool = Executors.newFixedThreadPool(2);
06  
07     public static void main(String[] args) {
08  
09         threadPool.execute(new Runnable() {
10             @Override
11             public void run() {
12                 try {
13                     String A = "銀行流水A";// A錄入銀行流水數據
14                     exgr.exchange(A);
15                 catch (InterruptedException e) {
16                 }
17             }
18         });
19  
20         threadPool.execute(new Runnable() {
21             @Override
22             public void run() {
23                 try {
24                     String B = "銀行流水B";// B錄入銀行流水數據
25                     String A = exgr.exchange("B");
26                     System.out.println("A和B數據是否一致:" + A.equals(B) + ",A錄入的是:"
27                             + A + ",B錄入是:" + B);
28                 catch (InterruptedException e) {
29                 }
30             }
31         });
32  
33         threadPool.shutdown();
34  
35     }
36 }

其他方法

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

最後更新:2017-05-23 16:34:10

  上一篇:go  麥肯錫報告:關於深度學習的120個商業機會
  下一篇:go  Akka文檔(java版)-為什麼選擇Akka