Java高并發(fā)中的交換器Exchanger解析
1.Exchanger簡介
Exchanger — 交換器,是JDK1.5時引入的一個同步器,從字面上就可以看出,這個類的主要作用是交換數(shù)據(jù)。
如果兩個線程并行處理,但在某個時刻需要互相交換自己已經處理完的中間數(shù)據(jù),然后才能繼續(xù)往下執(zhí)行。這個時候就可以使用 Exchanger。
Thread1線程到達柵欄后,會首先觀察有沒其它線程已經到達柵欄,如果沒有就會等待,如果已經有其它線程(Thread2)已經到達了,就會以成對的方式交換各自攜帶的信息,因此Exchanger非常適合用于兩個線程之間的數(shù)據(jù)交換。
2.Exchanger的使用
2.1 常用方法
//實現(xiàn)數(shù)據(jù)交換,x是交換的數(shù)據(jù),V是返回對方線程傳遞的數(shù)據(jù) public V exchange(V x) throws InterruptedException ? //用于交換,啟動交換并等待另一個線程調用exchange,并且設置最大等待時間,當?shù)却龝r間超過timeout便停止等待。 public V exchange(V x, long timeout, TimeUnit unit)
2.2 使用舉例
//數(shù)據(jù)交換器,用于數(shù)據(jù)交換 Exchanger<String> exchanger = new Exchanger<>(); ? //換書線程1 new Thread(()->{ String[] books_A = new String[]{"C++","操作系統(tǒng)"};//圖書數(shù)組 for (String bookNameA:books_A) { try { //交換數(shù)據(jù),bookNameA為我的書,exBook_A為我換回來的書 //System.out.println("線程A準備提交《"+bookNameA+"》書籍,等待交換..."); String exBook_A = exchanger.exchange(bookNameA); System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameA+"》換《"+exBook_A+"》"); } catch (InterruptedException e) { e.printStackTrace(); } } ? },"線程A").start(); ? //換書線程2 new Thread(()->{ String[] books_B = new String[]{"Java攻略","并發(fā)編程"};//圖書數(shù)組 for (String bookNameB:books_B) { try { String exBook_B = exchanger.exchange(bookNameB); System.out.println(Thread.currentThread().getName()+" 用 《"+bookNameB+"》換《"+exBook_B+"》"); } catch (InterruptedException e) { e.printStackTrace(); } } },"線程B").start();
- Exchanger 支持多個線程做數(shù)據(jù)交換;
- 多個線程使用同一個 Exchanger 做數(shù)據(jù)交換時,結果隨機,只要湊滿一對,就會進行交換。
到此這篇關于Java高并發(fā)中的交換器Exchanger解析的文章就介紹到這了,更多相關Java的Exchanger內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用動態(tài)規(guī)劃算法思想解決背包問題
背包問題(Knapsack problem)是一種組合優(yōu)化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高2022-04-04基于Java實現(xiàn)楊輝三角 LeetCode Pascal''s Triangle
這篇文章主要介紹了基于Java實現(xiàn)楊輝三角 LeetCode Pascal's Triangle的相關資料,需要的朋友可以參考下2016-01-01Java編程中使用XFire框架調用WebService程序接口
這篇文章主要介紹了Java編程中使用XFire調用WebService程序接口的方法,WebService是一種跨編程語言和跨操作系統(tǒng)平臺的遠程調用技術,需要的朋友可以參考下2015-12-12java使用Hashtable過濾數(shù)組中重復值的方法
這篇文章主要介紹了java使用Hashtable過濾數(shù)組中重復值的方法,涉及java數(shù)組遍歷及過濾的相關技巧,需要的朋友可以參考下2016-08-08