Java并發(fā)編程之Exchanger方法詳解
簡(jiǎn)介
Exchanger是一個(gè)用于線程間數(shù)據(jù)交換的工具類,它提供一個(gè)公共點(diǎn),在這個(gè)公共點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù)。
當(dāng)一個(gè)線程調(diào)用exchange方法后將進(jìn)入等待狀態(tài),直到另外一個(gè)線程調(diào)用exchange方法,雙方完成數(shù)據(jù)交換后繼續(xù)執(zhí)行。
Exchanger的使用
方法介紹
exchange(V x):阻塞當(dāng)前線程,直到另外一個(gè)線程調(diào)用exchange方法或者當(dāng)前線程被中斷。
- x : 需要交換的對(duì)象。
exchange(V x, long timeout, TimeUnit unit):阻塞當(dāng)前線程,直到另外一個(gè)線程調(diào)用exchange方法或者當(dāng)前線程被中斷或者等待超時(shí)。
- x: 需要交換的對(duì)象。
- timeout:超時(shí)時(shí)間。
- unit:超時(shí)時(shí)間單位。
exchange方法正常情況返回交換到的對(duì)象,當(dāng)當(dāng)前線程被中斷或者等待超時(shí)時(shí),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("等待超時(shí)-TimeoutException");
}
System.out.println("A同學(xué)得到了" + dataB);
});
studentA.start();
}
}
/*
* 輸出結(jié)果:
* 等待超時(shí)-TimeoutException
* A同學(xué)得到了null
*/
到此這篇關(guān)于Java并發(fā)編程之Exchanger方法詳解的文章就介紹到這了,更多相關(guān)Java并發(fā)編程Exchanger內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)最小生成樹(shù)算法詳解
這篇文章主要介紹了如何在Java中實(shí)現(xiàn)最小生成樹(shù)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-04-04
SpringMvc獲取請(qǐng)求頭請(qǐng)求體消息過(guò)程解析
這篇文章主要介紹了SpringMvc獲取請(qǐng)求頭請(qǐng)求體消息過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
從0開(kāi)始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項(xiàng)目實(shí)踐
這篇文章主要介紹了從0開(kāi)始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項(xiàng)目實(shí)踐,結(jié)合具體入門項(xiàng)目分析了大數(shù)據(jù)java spark編程項(xiàng)目建立、調(diào)試、輸出等相關(guān)步驟及操作技巧,需要的朋友可以參考下2019-11-11
Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理解析
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01

