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

