解析Java并發(fā)Exchanger的使用
類定義
public class Exchanger<V>
其中V表示需要交換的對象類型。
類繼承
java.lang.Object
java.util.concurrent.Exchanger<V>
Exchanger直接繼承自O(shè)bject。
構(gòu)造函數(shù)
Exchanger()
Exchanger提供一個無參構(gòu)造函數(shù)。
兩個主要方法
1.public V exchange(V x) throws InterruptedException
當這個方法被調(diào)用的時候,當前線程將會等待直到其他的線程調(diào)用同樣的方法。當其他的線程調(diào)用exchange之后,當前線程將會繼續(xù)執(zhí)行。
在等待過程中,如果有其他的線程interrupt當前線程,則會拋出InterruptedException。
2.public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
和第一個方法類似,區(qū)別是多了一個timeout時間。如果在timeout時間之內(nèi)沒有其他線程調(diào)用exchange方法,則會拋出TimeoutException。
具體的例子
我們先定義一個帶交換的類:
@Data
public class CustBook {
private String name;
}
然后定義兩個Runnable,在run方法中調(diào)用exchange方法:
@Slf4j
public class ExchangerOne implements Runnable{
Exchanger<CustBook> ex;
ExchangerOne(Exchanger<CustBook> ex){
this.ex=ex;
}
@Override
public void run() {
CustBook custBook= new CustBook();
custBook.setName("book one");
try {
CustBook exhangeCustBook=ex.exchange(custBook);
log.info(exhangeCustBook.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Slf4j
public class ExchangerTwo implements Runnable{
Exchanger<CustBook> ex;
ExchangerTwo(Exchanger<CustBook> ex){
this.ex=ex;
}
@Override
public void run() {
CustBook custBook= new CustBook();
custBook.setName("book two");
try {
CustBook exhangeCustBook=ex.exchange(custBook);
log.info(exhangeCustBook.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最后在主方法中調(diào)用:
public class ExchangerUsage {
public static void main(String[] args) {
Exchanger<CustBook> exchanger = new Exchanger<>();
// Starting two threads
new Thread(new ExchangerOne(exchanger)).start();
new Thread(new ExchangerTwo(exchanger)).start();
}
}
我們看下結(jié)果:
22:14:09.069 [Thread-1] INFO com.flydean.ExchangerTwo - book one
22:14:09.073 [Thread-0] INFO com.flydean.ExchangerOne - book two
可以看到對象已經(jīng)被交換了。
結(jié)語
Exchanger在兩個線程需要交換對象的時候非常好用。大家可以在實際工作生活中使用。
本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger
以上就是解析Java并發(fā)Exchanger的使用的詳細內(nèi)容,更多關(guān)于Java并發(fā)Exchanger的使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java CompletableFuture實現(xiàn)異步編排詳解
這篇文章主要為大家介紹了java CompletableFuture實現(xiàn)異步編排詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
SpringBoot+Shiro+LayUI權(quán)限管理系統(tǒng)項目源碼
本項目旨在打造一個基于RBAC架構(gòu)模式的通用的、并不復(fù)雜但易用的權(quán)限管理系統(tǒng),通過SpringBoot+Shiro+LayUI權(quán)限管理系統(tǒng)項目可以更好的幫助我們掌握springboot知識點,感興趣的朋友一起看看吧2021-04-04
springboot的類加載器(org.springframework.boot.loader)過程詳解
這篇文章主要介紹了springboot的類加載器(org.springframework.boot.loader),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Java線程池ThreadPoolExecutor原理及使用實例
這篇文章主要介紹了Java線程池ThreadPoolExecutor原理及使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
這篇文章主要介紹了Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解
這篇文章主要介紹了Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解,Spring默認使用類的空參構(gòu)造方法創(chuàng)建bean,假如類沒有空參構(gòu)造方法,將無法完成bean的創(chuàng)建,需要的朋友可以參考下2023-08-08
springboot 如何使用jedis連接Redis數(shù)據(jù)庫
這篇文章主要介紹了springboot 使用jedis連接Redis數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

