1. 程式人生 > >JAVA多線程提高十一:同步工具Exchanger

JAVA多線程提高十一:同步工具Exchanger

必須 new pub service ali 兩個 rac timeunit out

Exchanger可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與夥伴線程進行匹配,並且在返回時接收其夥伴的對象。Exchanger 可能被視為 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(比如遺傳算法和管道設計)中很有用。

構造方法摘要

Exchanger() 創建一個新的 Exchanger。

方法摘要

CountDownLatchCyclicBarrier
V exchange(V x) 等待另一個線程到達此交換點(除非當前線程被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。
V exchange(V x, long timeout, TimeUnit unit) 等待另一個線程到達此交換點(除非當前線程被中斷,或者超出了指定的等待時間),然後將給定的對象傳送給該線程,同時接收該線程的對象。

代碼示例

交換操作必須是成雙成對的,如果線程是奇數操作,那麽兩個會交換成功,另一個會一直等待交換。

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

public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Exchanger<String> exchanger = new Exchanger<String>(); service.execute(new Runnable() { public void run() {
try { String data1 = "zxx"; System.out.println("線程" + Thread.currentThread().getName() + "正在把數據" + data1 + "換出去"); Thread.sleep((long) Math.random() * 10000); String data2=(String) exchanger.exchange(data1); System.out.println("線程" + Thread.currentThread().getName() + "換回的數據為" + data2); } catch (Exception e) { e.printStackTrace(); } } }); service.execute(new Runnable() { public void run() { try { String data1 = "lhm"; System.out.println("線程" + Thread.currentThread().getName() + "正在把數據" + data1 + "換出去"); Thread.sleep((long) Math.random() * 10000); String data2=(String) exchanger.exchange(data1); System.out.println("線程" + Thread.currentThread().getName() + "換回的數據為" + data2); } catch (Exception e) { e.printStackTrace(); } } }); service.shutdown(); } }

參考資料:

<<多線程視頻>> 張孝祥

JAVA多線程提高十一:同步工具Exchanger