【原創】Java併發編程系列25 | 交換器Exchanger

【原創】Java併發編程系列25 | 交換器Exchanger

2020年Java面試題庫連載中

【原創】Java併發編程系列25 | 交換器Exchanger

很尷尬,發了併發編程的26和27,漏了本篇25。這下子我是真的沒存貨了哈哈。那下面我們來補上25先,25比較短小...勿噴。

Exchanger是一個用於線程間協作的工具類,用於兩個線程間交換。本篇只介紹Exchanger的使用,不講解源碼。(因Exchanger類的源碼很是複雜,而且對平時開發設計借鑑意義也不是很大,所以本人至今沒有徹底研究明白,也就不在這裏誤導大家了。)

Exchanger提供了一個交換的同步點,在這個同步點兩個線程能夠交換數據。

【原創】Java併發編程系列25 | 交換器Exchanger

用一個簡單的例子來看下Exchanger的具體使用。兩方做交易,如果一方先到要等另一方也到了才能交易,交易就是執行exchange方法交換數據。

public class ExchangerTest {
private static Exchanger exchanger = new Exchanger();
static String goods = "電腦";
static String money = "$1000";

public static void main(String[] args) throws InterruptedException {
System.out.println("準備交易,一手交錢一手交貨...");
// 賣家
new Thread() {
public void run() {
System.out.println(getName() + " 賣家到了,已經準備好貨:" + goods);
try {
String money = exchanger.exchange(goods);
System.out.println(getName() + " 賣家收到錢:" + money);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
Thread.sleep(3000);
// 買家
new Thread() {
public void run() {
try {
System.out.println(getName() + " 買家到了,已經準備好錢:" + money);
String goods = exchanger.exchange(money);
System.out.println(getName() + " 買家收到貨:" + goods);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}

輸出結果:

準備交易,一手交錢一手交貨...
Thread-0 賣家到了,已經準備好貨:電腦
Thread-1 買家到了,已經準備好錢:$1000
Thread-1 買家收到貨:電腦
Thread-0 賣家收到錢:$1000
參考資料

《Java併發編程之美》

《Java併發編程實戰》

《Java併發編程的藝術》

併發系列文章彙總

之前,給大家發過四份Java面試寶典,這次新增了更全面的資料,相信在跳槽前準備準備,基本沒大問題。

java基礎:設計模式等》(初中級)

JVM:整理BAT最新題庫》《併發編程》(中高級)

《分佈式微服務架構》《架構|軟技能》(資深)

《一線互聯網公司面試指南》(資深)

學習視頻包含深入運行時數據區、垃圾回收、詳解類裝載過程及類加載機制、手寫Spring-IOC容器、redis入門到高性能緩存組件等等

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 1455 字。

轉載請註明: 【原創】Java併發編程系列25 | 交換器Exchanger - 楠木軒