java並發Exchanger的使用


簡介

Exchanger是java 5引入的並發類,Exchanger顧名思義就是用來做交換的。這里主要是兩個線程之間交換持有的對象。當Exchanger在一個線程中調用exchange方法之后,會等待另外的線程調用同樣的exchange方法。

兩個線程都調用exchange方法之后,傳入的參數就會交換。

類定義

public class Exchanger<V>

其中V表示需要交換的對象類型。

類繼承

java.lang.Object
↳ java.util.concurrent.Exchanger<V>

Exchanger直接繼承自Object。

構造函數

Exchanger() 

Exchanger提供一個無參構造函數。

兩個主要方法

  1. public V exchange(V x) throws InterruptedException

當這個方法被調用的時候,當前線程將會等待直到其他的線程調用同樣的方法。當其他的線程調用exchange之后,當前線程將會繼續執行。

在等待過程中,如果有其他的線程interrupt當前線程,則會拋出InterruptedException。

  1. public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

和第一個方法類似,區別是多了一個timeout時間。如果在timeout時間之內沒有其他線程調用exchange方法,則會拋出TimeoutException。

具體的例子

我們先定義一個帶交換的類:

@Data
public class CustBook {

    private String name;
}

然后定義兩個Runnable,在run方法中調用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();
        }
    }
}

最后在主方法中調用:

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();
    }
}

我們看下結果:

22:14:09.069 [Thread-1] INFO com.flydean.ExchangerTwo - book one
22:14:09.073 [Thread-0] INFO com.flydean.ExchangerOne - book two

可以看到對象已經被交換了。

結語

Exchanger在兩個線程需要交換對象的時候非常好用。大家可以在實際工作生活中使用。

本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger

歡迎關注我的公眾號:程序那些事,更多精彩等着您!
更多內容請訪問 www.flydean.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM