1. 程式人生 > >Java並發工具類之線程間數據交換工具Exchanger

Java並發工具類之線程間數據交換工具Exchanger

catch exchanger 系統 chang data 完成後 () time ktr

  Exchanger是一個用於線程間協做的工具類,主要用於線程間的數據交換。它提供了一個同步點,在這個同步點,兩個線程可以彼此交換數據。兩個線程通過exchange方法交換數據,如果一個線程執行exchange方法,它就會等待另一個線程執行exchange方法,當兩個線程都到達了同步點,這兩個線程就可以交換數據。將本線程產生的數據傳送給對方。

  Exchanger可用於工作的互相校對,比如我們要把線下產生的交易數據通過人工錄入的方式添加到系統中,為了避免錯誤,我們采用AB兩人同時錄入的方式,當錄入完成後,系統分別加載AB兩人錄入的數據,檢查是否出錯。

  模擬實例如下:

  

public
class ExchangerTest { //定義交換器 private static final Exchanger<String> exchanger = new Exchanger<String>(); private static ExecutorService threadPool = Executors.newFixedThreadPool(2); public static void main(String[] args){ threadPool.execute(new Runnable() { @Override
public void run() { String strA = "a record data"; try { exchanger.exchange(strA); } catch (InterruptedException e) { e.printStackTrace(); } } }); threadPool.execute(new
Runnable() { @Override public void run() { try { String strB = "b record data"; String strA= exchanger.exchange(strB); System.out.println(strA.equals(strB)); exchanger.exchange(strB); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }

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

Java並發工具類之線程間數據交換工具Exchanger