Java Exchanger并發(fā)類使用方法
簡介
Exchanger是java 5引入的并發(fā)類,Exchanger顧名思義就是用來做交換的。這里主要是兩個(gè)線程之間交換持有的對(duì)象。當(dāng)Exchanger在一個(gè)線程中調(diào)用exchange方法之后,會(huì)等待另外的線程調(diào)用同樣的exchange方法。
兩個(gè)線程都調(diào)用exchange方法之后,傳入的參數(shù)就會(huì)交換。
類定義
public class Exchanger<V>
其中V表示需要交換的對(duì)象類型。
類繼承
java.lang.Object
↳ java.util.concurrent.Exchanger<V>
Exchanger直接繼承自O(shè)bject。
構(gòu)造函數(shù)
Exchanger()
Exchanger提供一個(gè)無參構(gòu)造函數(shù)。
兩個(gè)主要方法
public V exchange(V x) throws InterruptedException
當(dāng)這個(gè)方法被調(diào)用的時(shí)候,當(dāng)前線程將會(huì)等待直到其他的線程調(diào)用同樣的方法。當(dāng)其他的線程調(diào)用exchange之后,當(dāng)前線程將會(huì)繼續(xù)執(zhí)行。
在等待過程中,如果有其他的線程interrupt當(dāng)前線程,則會(huì)拋出InterruptedException。
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
和第一個(gè)方法類似,區(qū)別是多了一個(gè)timeout時(shí)間。如果在timeout時(shí)間之內(nèi)沒有其他線程調(diào)用exchange方法,則會(huì)拋出TimeoutException。
具體的例子
我們先定義一個(gè)帶交換的類:
@Data
public class CustBook {
private String name;
}
然后定義兩個(gè)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
可以看到對(duì)象已經(jīng)被交換了。
結(jié)語
Exchanger在兩個(gè)線程需要交換對(duì)象的時(shí)候非常好用。大家可以在實(shí)際工作生活中使用。
本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談SpringBoot實(shí)現(xiàn)自動(dòng)裝配的方法原理
SpringBoot的自動(dòng)裝配是它的一大特點(diǎn),可以大大提高開發(fā)效率,減少重復(fù)性代碼的編寫。本文將詳細(xì)講解SpringBoot如何實(shí)現(xiàn)自動(dòng)裝配,需要的朋友可以參考下2023-05-05
Java通過動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡單的攔截器操作
這篇文章主要介紹了Java通過動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡單的攔截器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java多線程(單例模式,堵塞隊(duì)列,定時(shí)器)詳解
這篇文章主要介紹了java多線程的(單例模式,堵塞隊(duì)列,定時(shí)器),具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下2021-08-08
SpringBoot 如何使用RestTemplate發(fā)送Post請(qǐng)求
這篇文章主要介紹了SpringBoot 如何使用RestTemplate發(fā)送Post請(qǐng)求的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java設(shè)置Access-Control-Allow-Origin允許多域名訪問的實(shí)現(xiàn)方法
這篇文章主要介紹了Java設(shè)置Access-Control-Allow-Origin允許多域名訪問的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
Java?中的?clone(?)?和?new哪個(gè)效率更高
很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問題,感興趣的朋友跟隨小編一起看看吧2021-12-12
Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解,CGLIB是強(qiáng)大的、高性能的代碼生成庫,被廣泛應(yīng)用于AOP框架,它底層使用ASM來操作字節(jié)碼生成新的類,為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問,需要的朋友可以參考下2023-11-11
ArrayList詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
ArrayList 是一個(gè)數(shù)組隊(duì)列,相當(dāng)于 動(dòng)態(tài)數(shù)組。與Java中的數(shù)組相比,它的容量能動(dòng)態(tài)增長。接下來通過本文給大家介紹arraylist詳解和使用示例代碼,需要的的朋友一起學(xué)習(xí)吧2017-05-05

