Java多線程中的Exchanger應(yīng)用簡(jiǎn)析
Exchanger簡(jiǎn)析
Exchanger用于線程間進(jìn)行通信、數(shù)據(jù)交換。
Exchanger提供了一個(gè)同步點(diǎn)exchange方法,兩個(gè)線程調(diào)用exchange方法時(shí),無(wú)論調(diào)用時(shí)間先后,兩個(gè)線程會(huì)互相等到線程到達(dá)exchange方法調(diào)用點(diǎn),此時(shí)兩個(gè)線程可以交換數(shù)據(jù),將本線程產(chǎn)出數(shù)據(jù)傳遞給對(duì)方。
演示示例1
package com.securitit.serialize.juc;
import java.util.concurrent.Exchanger;
public class ExchangerTester {
// Exchanger實(shí)例.
private static final Exchanger<String> exchanger = new Exchanger<String>();
public static void main(String[] args) {
// 模擬阻塞線程.
new Thread(() -> {
try {
String wares = "紅燒肉";
System.out.println(Thread.currentThread().getName() + "商品方正在等待金錢方,使用貨物兌換為金錢.");
Thread.sleep(2000);
String money = exchanger.exchange(wares);
System.out.println(Thread.currentThread().getName() + "商品方使用商品兌換了" + money);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}).start();
// 模擬阻塞線程.
new Thread(() -> {
try {
String money = "人民幣";
System.out.println(Thread.currentThread().getName() + "金錢方正在等待商品方,使用金錢購(gòu)買食物.");
Thread.sleep(4000);
String wares = exchanger.exchange(money);
System.out.println(Thread.currentThread().getName() + "金錢方使用金錢購(gòu)買了" + wares);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}).start();
}
}輸出結(jié)果:
Thread-0商品方正在等待金錢方,使用貨物兌換為金錢.
Thread-1金錢方正在等待商品方,使用金錢購(gòu)買食物.
Thread-0商品方使用商品兌換了人民幣
Thread-1金錢方使用金錢購(gòu)買了紅燒肉
從結(jié)果可以看出,線程Thread-0首先調(diào)用了exchange方法,等待線程Thread-1到達(dá)exchange方法。
當(dāng)線程Thread-0和Thread-1兩者都到達(dá)exchange方法時(shí),通過exchange進(jìn)行了數(shù)據(jù)交換。從結(jié)果可以看出,兩個(gè)都拿到了對(duì)方傳遞的數(shù)據(jù)。
演示示例2
接下來(lái)演示public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;
package com.securitit.serialize.juc;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
public class ExchangerTimeTester {
// Exchanger實(shí)例.
private static final Exchanger<String> exchanger = new Exchanger<String>();
public static void main(String[] args) {
// 模擬阻塞線程.
new Thread(() -> {
try {
String wares = "紅燒肉";
System.out.println(Thread.currentThread().getName() + "商品方正在等待金錢方,使用貨物兌換為金錢.");
Thread.sleep(2000);
String money = exchanger.exchange(wares, 1000, TimeUnit.MILLISECONDS);
System.out.println(Thread.currentThread().getName() + "商品方使用商品兌換了" + money);
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
// 模擬阻塞線程.
new Thread(() -> {
try {
String money = "人民幣";
System.out.println(Thread.currentThread().getName() + "金錢方正在等待商品方,使用金錢購(gòu)買食物.");
Thread.sleep(4000);
String wares = exchanger.exchange(money);
System.out.println(Thread.currentThread().getName() + "金錢方使用金錢購(gòu)買了" + wares);
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}
}輸出結(jié)果:
Thread-0商品方正在等待金錢方,使用貨物兌換為金錢.
Thread-1金錢方正在等待商品方,使用金錢購(gòu)買食物.
java.util.concurrent.TimeoutException
at java.util.concurrent.Exchanger.exchange(Exchanger.java:626)
at com.securitit.serialize.juc.ExchangerTimeTester.lambda$0(ExchangerTimeTester.java:18)
at java.lang.Thread.run(Thread.java:748)
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;
API中,若阻塞線程等待超過指定時(shí)間,則會(huì)拋出異常。
到此這篇關(guān)于Java多線程中的Exchanger應(yīng)用簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Exchanger簡(jiǎn)析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)體類與String相互轉(zhuǎn)換實(shí)現(xiàn)方式
文章記錄了將實(shí)體類與String相互轉(zhuǎn)換的方法,此方法適用于多種場(chǎng)景,如配置轉(zhuǎn)換等,轉(zhuǎn)換過程包括將實(shí)體類轉(zhuǎn)為String保存至數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)取出String再轉(zhuǎn)為實(shí)體類,此經(jīng)驗(yàn)僅供參考2026-04-04
springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
spring batch 讀取多個(gè)文件數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)示例
本篇文章主要介紹了spring batch 讀取多個(gè)文件數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-03-03
解決mybatis-generator生成器添加類注釋方法無(wú)效的問題
這篇文章主要介紹了解決mybatis-generator生成器添加類注釋方法無(wú)效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Nexus安裝和啟動(dòng)的實(shí)現(xiàn)教程
這篇文章主要介紹了Nexus安裝和啟動(dòng)的實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Java9版本新特性同一個(gè)Jar支持多JDK版本運(yùn)行
這篇文章主要為大家介紹了Java9新版本的特性之同一個(gè)Jar支持多JDK版本運(yùn)行的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring MVC @GetMapping和@PostMapping注解的使用方式
這篇文章主要介紹了Spring MVC @GetMapping和@PostMapping注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來(lái)介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11
Java數(shù)據(jù)結(jié)構(gòu)之鏈表的概念及結(jié)構(gòu)
這篇文章主要介紹了數(shù)據(jù)鏈表的概念及結(jié)構(gòu),鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。想進(jìn)一步了解的同學(xué),可以參考閱讀本文2023-04-04

