Java并發(fā)編程之Exchanger方法詳解
簡介
Exchanger是一個用于線程間數(shù)據(jù)交換的工具類,它提供一個公共點(diǎn),在這個公共點(diǎn),兩個線程可以交換彼此的數(shù)據(jù)。
當(dāng)一個線程調(diào)用exchange方法后將進(jìn)入等待狀態(tài),直到另外一個線程調(diào)用exchange方法,雙方完成數(shù)據(jù)交換后繼續(xù)執(zhí)行。
Exchanger的使用
方法介紹
exchange(V x):阻塞當(dāng)前線程,直到另外一個線程調(diào)用exchange方法或者當(dāng)前線程被中斷。
- x : 需要交換的對象。
exchange(V x, long timeout, TimeUnit unit):阻塞當(dāng)前線程,直到另外一個線程調(diào)用exchange方法或者當(dāng)前線程被中斷或者等待超時。
- x: 需要交換的對象。
- timeout:超時時間。
- unit:超時時間單位。
exchange方法正常情況返回交換到的對象,當(dāng)當(dāng)前線程被中斷或者等待超時時,exchange方法返回null。
示例1:A同學(xué)和B同學(xué)交換各自收藏的大片
public class Demo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { try { String dataA = "A同學(xué)收藏多年的大片"; String dataB = stringExchanger.exchange(dataA); System.out.println("A同學(xué)得到了" + dataB); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread studentB = new Thread(() -> { try { String dataB = "B同學(xué)收藏多年的大片"; String dataA = stringExchanger.exchange(dataB); System.out.println("B同學(xué)得到了" + dataA); } catch (InterruptedException e) { e.printStackTrace(); } }); studentA.start(); studentB.start(); } } /* * 輸出結(jié)果: * B同學(xué)得到了A同學(xué)收藏多年的大片 * A同學(xué)得到了B同學(xué)收藏多年的大片 */
示例2:A同學(xué)被放鴿子,交易失敗
public class Demo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { String dataB = null; try { String dataA = "A同學(xué)收藏多年的大片"; //最多等待5秒 dataB = stringExchanger.exchange(dataA, 5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException ex){ System.out.println("等待超時-TimeoutException"); } System.out.println("A同學(xué)得到了" + dataB); }); studentA.start(); } } /* * 輸出結(jié)果: * 等待超時-TimeoutException * A同學(xué)得到了null */
到此這篇關(guān)于Java并發(fā)編程之Exchanger方法詳解的文章就介紹到這了,更多相關(guān)Java并發(fā)編程Exchanger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過反射創(chuàng)建對象并調(diào)用方法
這篇文章主要介紹了java通過反射創(chuàng)建對象并調(diào)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01idea2020.1最新版永久破解/pycharm也可用(步驟詳解)
這篇文章主要介紹了idea2020.1最新版永久破解/pycharm也可用,本文給大家分享簡單實(shí)現(xiàn)步驟,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解
簡單說,ElasticSearch(簡稱 ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎。下面這篇文章主要給大家介紹了關(guān)于Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-05-05Spring的請求映射handlerMapping以及原理詳解
這篇文章主要介紹了Spring的請求映射handlerMapping以及原理詳解,我們每次發(fā)請求,它到底是怎么找到我們哪個方法來去處理這個請求,因?yàn)槲覀冎浪械恼埱筮^來都會來到DispatcherServlet,springboot底層還是使用的是springMVC,需要的朋友可以參考下2023-08-08