解析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)文章
springboot實現(xiàn)rabbitmq的隊列初始化和綁定
這篇文章主要介紹了springboot實現(xiàn)rabbitmq的隊列初始化和綁定,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10Spring Boot日志收集及鏈路追蹤實現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot日志收集及鏈路追蹤實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12詳解Spring Boot 使用slf4j+logback記錄日志配置
本篇文章主要介紹了Spring Boot 使用slf4j+logback記錄日志配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例
這篇文章主要介紹了java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08