亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年06月01日 13:09:42   作者:flydean  
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è)主要方法

1.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。

2.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

以上就是解析Java并發(fā)Exchanger的使用的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)Exchanger的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定

    springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定

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

    基于Java protected的深入理解

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

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

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

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

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

    淺談Springboot整合RocketMQ使用心得

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

    idea右鍵沒有java class選項(xiàng)問題解決方案

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

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

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

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

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

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

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

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

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

最新評(píng)論