JAVA多線程提高十一:同步工具Exchanger
阿新 • • 發佈:2018-07-16
必須 new pub service ali 兩個 rac timeunit out
Exchanger可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與夥伴線程進行匹配,並且在返回時接收其夥伴的對象。Exchanger 可能被視為 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(比如遺傳算法和管道設計)中很有用。
構造方法摘要
Exchanger() 創建一個新的 Exchanger。
方法摘要
CountDownLatch | CyclicBarrier |
---|---|
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