本文研究的主要是Java編程線程同步工具Exchanger的使用,下面看看具體內(nèi)容。

網(wǎng)站設(shè)計(jì)制作過(guò)程拒絕使用模板建站;使用PHP+MYSQL原生開(kāi)發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺(tái)管理系統(tǒng);成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營(yíng)了10余年的創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司。
如果兩個(gè)線程在運(yùn)行過(guò)程中需要交換彼此的信息,比如一個(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è)通俗的例子:一手交錢(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è)線程執(zhí)行任務(wù)
service.execute(new Runnable(){
@Override
public void run() {
try {
String data1 = "海洛因";
System.out.println("線程" + Thread.currentThread().getName()
+ "正在把毒品" + data1 + "拿出來(lái)");
Thread.sleep((long)(Math.random()*10000));
//把要交換的數(shù)據(jù)傳到exchange方法中,然后被阻塞,等待另一個(gè)線程與之交換。返回交換后的數(shù)據(jù)
String data2 = (String)exchanger.exchange(data1);
System.out.println("線程" + Thread.currentThread().getName() +
"用海洛因換來(lái)了" + data2);
}
catch(Exception e){
}
finally {
service.shutdown();
System.out.println("交易完畢,拿著錢(qián)快跑!");
}
}
}
);
//開(kāi)啟另一個(gè)線程執(zhí)行任務(wù)
service.execute(new Runnable(){
@Override
public void run() {
try {
String data1 = "300萬(wàn)";
System.out.println("線程" + Thread.currentThread().getName() +
"正在把" + data1 +"拿出來(lái)");
Thread.sleep((long)(Math.random()*10000));
String data2 = (String)exchanger.exchange(data1);
System.out.println("線程" + Thread.currentThread().getName() +
"用300萬(wàn)弄到了" + data2);
}
catch(Exception e){
}
finally {
service.shutdown();
System.out.println("交易完畢,拿著海洛因快跑!");
}
}
}
);
}
}從代碼中我仿佛看到了兩個(gè)人在交易毒品的場(chǎng)面……來(lái)看一下交易結(jié)果如何:
線程pool-1-thread-1正在把毒品海洛因拿出來(lái)
線程pool-1-thread-2正在把300萬(wàn)拿出來(lái)
線程pool-1-thread-2用300萬(wà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è)基本類型的數(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é)這么多吧~
以上就是本文關(guān)于Java編程線程同步工具Exchanger的使用實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
文章名稱:Java編程線程同步工具Exchanger的使用實(shí)例解析
瀏覽地址:http://chinadenli.net/article48/goecep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、虛擬主機(jī)、網(wǎng)站導(dǎo)航、App開(kāi)發(fā)、電子商務(wù)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)