1. 程式人生 > >【java並發核心二】Exchanger的使用

【java並發核心二】Exchanger的使用

system exce str inf info png 簡單 import ger

類 Exchanger 的功能可以使2個線程之間傳輸數據,比生產者/消費者模式方便。

Exchanger類的結構很簡單,重點就是exchange()方法。

exchange()方法是阻塞執行的,可以設置超時時間,調用不同的api即可。

exchange 的 英文意思就是交換,而對於線程而言也是這樣的,就是兩個線程交換信息。如果共有3個線程,且3個線程同時調用了exchange,那麽就會有一個線程沒有交換信息的對象,就會繼續阻塞。

下面是一個例子:

共有兩個類 ExchangerThread、ExchangerTest:

package com.cd.concurrent.exchanger;

import java.util.concurrent.Exchanger; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class ExchangerThread extends Thread { private Exchanger<String> exchanger; private String name; public ExchangerThread(String name, Exchanger<String> exchanger) {
super(); this.name = name; this.exchanger = exchanger; } @Override public void run() { try { // System.out.println("線程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg")); // 不設置超時時間,線程會一直阻塞等待 System.out.println("線程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg", 5, TimeUnit.SECONDS)); //
設置5秒的超時時間 System.out.println("線程[" + name + "]over"); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.cd.concurrent.exchanger;

import java.util.concurrent.Exchanger;

public class ExchangerTest {

    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<String>();
        ExchangerThread t1 = new ExchangerThread("t1", exchanger);
        ExchangerThread t2 = new ExchangerThread("t2", exchanger);
        ExchangerThread t3 = new ExchangerThread("t3", exchanger);
        t1.start();
        t2.start();
        t3.start();
    }

}

運行結果:

技術分享圖片

【java並發核心二】Exchanger的使用