Java編程線(xiàn)程同步工具Exchanger的使用實(shí)例解析
本文研究的主要是Java編程線(xiàn)程同步工具Exchanger的使用,下面看看具體內(nèi)容。
如果兩個(gè)線(xiàn)程在運(yùn)行過(guò)程中需要交換彼此的信息,比如一個(gè)數(shù)據(jù)或者使用的空間,就需要用到Exchanger這個(gè)類(lèi),Exchanger為線(xiàn)程交換信息提供了非常方便的途徑,它可以作為兩個(gè)線(xiàn)程交換對(duì)象的同步點(diǎn),只有當(dāng)每個(gè)線(xiàn)程都在進(jìn)入 exchange ()方法并給出對(duì)象時(shí),才能接受其他線(xiàn)程返回時(shí)給出的對(duì)象。
每次只能兩個(gè)線(xiàn)程交換數(shù)據(jù),如果有多個(gè)線(xiàn)程,也只有兩個(gè)能交換數(shù)據(jù)。下面看個(gè)通俗的例子:一手交錢(qián)一首交貨!
public class ExchangerTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final Exchanger exchanger = new Exchanger();
//定義一個(gè)交換對(duì)象,用來(lái)交換數(shù)據(jù)
//開(kāi)啟一個(gè)線(xiàn)程執(zhí)行任務(wù)
service.execute(new Runnable(){
@Override
public void run() {
try {
String data1 = "海";
System.out.println("線(xiàn)程" + Thread.currentThread().getName()
+ "正在把品" + data1 + "拿出來(lái)");
Thread.sleep((long)(Math.random()*10000));
//把要交換的數(shù)據(jù)傳到exchange方法中,然后被阻塞,等待另一個(gè)線(xiàn)程與之交換。返回交換后的數(shù)據(jù)
String data2 = (String)exchanger.exchange(data1);
System.out.println("線(xiàn)程" + Thread.currentThread().getName() +
"用海換來(lái)了" + data2);
}
catch(Exception e){
}
finally {
service.shutdown();
System.out.println("交易完畢,拿著錢(qián)快跑!");
}
}
}
);
//開(kāi)啟另一個(gè)線(xiàn)程執(zhí)行任務(wù)
service.execute(new Runnable(){
@Override
public void run() {
try {
String data1 = "300萬(wàn)";
System.out.println("線(xiàn)程" + Thread.currentThread().getName() +
"正在把" + data1 +"拿出來(lái)");
Thread.sleep((long)(Math.random()*10000));
String data2 = (String)exchanger.exchange(data1);
System.out.println("線(xiàn)程" + Thread.currentThread().getName() +
"用300萬(wàn)弄到了" + data2);
}
catch(Exception e){
}
finally {
service.shutdown();
System.out.println("交易完畢,拿著??炫?!");
}
}
}
);
}
}從代碼中我仿佛看到了兩個(gè)人在交易品的場(chǎng)面……來(lái)看一下交易結(jié)果如何:
線(xiàn)程pool-1-thread-1正在把品海拿出來(lái)
線(xiàn)程pool-1-thread-2正在把300萬(wàn)拿出來(lái)
線(xiàn)程pool-1-thread-2用300萬(wàn)弄到了海
線(xiàn)程pool-1-thread-1用海換來(lái)了300萬(wàn)
交易完畢,拿著海快跑!
交易完畢,拿著錢(qián)快跑!
跑的倒是快,從運(yùn)行結(jié)果來(lái)看,確實(shí)實(shí)現(xiàn)了數(shù)據(jù)的交換,這個(gè)只是交換一個(gè)基本類(lèi)型的數(shù)據(jù)而已,它真正的用處不僅僅局限于此,比如我們可以交換一個(gè)對(duì)象,這就有用了,JDK官方提到了一個(gè)高級(jí)的應(yīng)用:
使用 Exchanger 在線(xiàn)程間交換緩沖區(qū),因此,在需要時(shí),填充緩沖區(qū)的線(xiàn)程獲取一個(gè)新騰空的緩沖區(qū),并將填滿(mǎn)的緩沖區(qū)傳遞給騰空緩沖區(qū)的線(xiàn)程。
這就得根據(jù)實(shí)際情況了,思想和上面的一樣,實(shí)際中肯定要定義一個(gè)緩沖區(qū)的類(lèi),然后兩個(gè)線(xiàn)程之間交換的就是這個(gè)緩沖區(qū)的類(lèi)即可,至于類(lèi)中如何實(shí)現(xiàn),就得看實(shí)際情況了。Exchanger的使用就總結(jié)這么多吧~
總結(jié)
以上就是本文關(guān)于Java編程線(xiàn)程同步工具Exchanger的使用實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Spring之AOP兩種代理機(jī)制對(duì)比分析(JDK和CGLib動(dòng)態(tài)代理)
這篇文章主要介紹了Spring之AOP兩種代理機(jī)制對(duì)比分析(JDK和CGLib動(dòng)態(tài)代理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java中復(fù)雜查詢(xún)sql語(yǔ)句該怎么寫(xiě)
我們知道在java連接數(shù)據(jù)庫(kù)之后,需要數(shù)據(jù)庫(kù)的sql語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于java中復(fù)雜查詢(xún)sql語(yǔ)句該怎么寫(xiě)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
SpringBoot去除內(nèi)嵌tomcat的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot去除內(nèi)嵌tomcat的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
spring boot實(shí)現(xiàn)阿里云視頻點(diǎn)播上傳視頻功能(復(fù)制粘貼即可)
這篇文章主要介紹了spring boot實(shí)現(xiàn)阿里云視頻點(diǎn)播上傳視頻功能(復(fù)制粘貼即可),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java設(shè)計(jì)模式中的建造者(Builder)模式解讀
這篇文章主要介紹了Java設(shè)計(jì)模式中的建造者(Builder)模式解讀, 建造者模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它通過(guò)將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)步驟,并使用一個(gè)建造者類(lèi)來(lái)封裝這些步驟,從而使得對(duì)象的構(gòu)建過(guò)程更加靈活和可擴(kuò)展,需要的朋友可以參考下2023-10-10
JAVA類(lèi)變量及類(lèi)方法代碼實(shí)例詳解
這篇文章主要介紹了JAVA類(lèi)變量及類(lèi)方法代碼實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

