欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java并發(fā)Exchanger的使用

 更新時間:2021年06月01日 13:09:42   作者:flydean  
Exchanger是java 5引入的并發(fā)類,Exchanger顧名思義就是用來做交換的。這里主要是兩個線程之間交換持有的對象。當Exchanger在一個線程中調(diào)用exchange方法之后,會等待另外的線程調(diào)用同樣的exchange方法。兩個線程都調(diào)用exchange方法之后,傳入的參數(shù)就會交換。

類定義

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的隊列初始化和綁定

    這篇文章主要介紹了springboot實現(xiàn)rabbitmq的隊列初始化和綁定,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 基于Java protected的深入理解

    基于Java protected的深入理解

    本篇文章是對Java protected進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 定時任務(wù)注解@Scheduled不生效問題及解決

    定時任務(wù)注解@Scheduled不生效問題及解決

    這篇文章主要介紹了定時任務(wù)注解@Scheduled不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java基礎(chǔ)學(xué)習(xí)筆記之反射

    java基礎(chǔ)學(xué)習(xí)筆記之反射

    什么是反射?Java 程序在運行期間可以動態(tài)加載、解析和使用一些在編譯階段并不確定的類型數(shù)據(jù),這一機制被稱為反射(Reflection)。今天我們就來詳細探討下java中的反射
    2016-02-02
  • 淺談Springboot整合RocketMQ使用心得

    淺談Springboot整合RocketMQ使用心得

    本篇文章主要介紹了Springboot整合RocketMQ使用心得,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • idea右鍵沒有java class選項問題解決方案

    idea右鍵沒有java class選項問題解決方案

    這篇文章主要介紹了idea右鍵沒有java class選項問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Spring Boot日志收集及鏈路追蹤實現(xiàn)示例

    Spring Boot日志收集及鏈路追蹤實現(xiàn)示例

    這篇文章主要為大家介紹了Spring Boot日志收集及鏈路追蹤實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • java反射獲取和調(diào)用方法

    java反射獲取和調(diào)用方法

    本篇內(nèi)容主要給大家詳細講解了java反射獲取方法以及調(diào)用方法,需要的朋友參考學(xué)習(xí)一下吧。
    2017-12-12
  • 詳解Spring Boot 使用slf4j+logback記錄日志配置

    詳解Spring Boot 使用slf4j+logback記錄日志配置

    本篇文章主要介紹了Spring Boot 使用slf4j+logback記錄日志配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例

    java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例

    這篇文章主要介紹了java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08

最新評論