Java并發(fā)工具類Exchanger的相關(guān)知識(shí)總結(jié)
一、Exchanger的理解
- Exchanger 屬于java.util.concurrent包;
- Exchanger 是 JDK 1.5 開(kāi)始提供的一個(gè)用于兩個(gè)工作線程之間交換數(shù)據(jù)的封裝工具類;
- 一個(gè)線程在完成一定的事務(wù)后想與另一個(gè)線程交換數(shù)據(jù),則第一個(gè)先拿出數(shù)據(jù)的線程會(huì)一直等待第二個(gè)線程,直到第二個(gè)線程拿著數(shù)據(jù)到來(lái)時(shí)才能彼此交換對(duì)應(yīng)數(shù)據(jù)。
二、Exchanger類中常用方法

- public Exchanger() 無(wú)參構(gòu)造方法。表示創(chuàng)建一個(gè)新的交換器。
- public V exchange(V x) 等待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為 interrupted ),然后將給定對(duì)象傳輸給它,接收其對(duì)象作為回報(bào)。
(1)、x :表示可以交換的對(duì)象
- public V exchange(V x, long timeout, TimeUnit unit) 等待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為 interrupted或指定的等待時(shí)間已過(guò)),然后將給定對(duì)象傳輸給它,接收其對(duì)象作為回報(bào)。
(1)、 x :交換對(duì)象
(2)、timeout :等待的最長(zhǎng)時(shí)間
(3)、unit :timeout參數(shù)的時(shí)間單位
三、Exchanger類的使用示例
案例場(chǎng)景
模擬客戶端和服務(wù)端交換數(shù)據(jù)。
1、代碼
package com.xz.thread.Exchanger;
import java.util.concurrent.Exchanger;
/**
* @description:
* @author: xz
* @create: 2021-05-31 21:56
*/
public class Demo {
//定義一個(gè)服務(wù)端方法
public void serverMethod(Exchanger<String> exchanger){
System.out.println("【服務(wù)端】方法開(kāi)始執(zhí)行");
//睡眠1秒鐘
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//定義服務(wù)端數(shù)據(jù)
String data="serverData";
//等待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為interrupted),然后將給定對(duì)象傳輸給它,接收其對(duì)象作為回報(bào)。
String exchangeData="";
try {
exchangeData=exchanger.exchange(data);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("服務(wù)端原數(shù)據(jù)="+"serverData,"+" 交換后的數(shù)據(jù)=" + exchangeData);
}
//定義一個(gè)客戶端方法
public void clientMethod(Exchanger<String> exchanger){
System.out.println("【客戶端】方法開(kāi)始執(zhí)行");
//睡眠3秒鐘
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//定義客戶端數(shù)據(jù)
String data="clientData";
//等待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為interrupted),然后將給定對(duì)象傳輸給它,接收其對(duì)象作為回報(bào)。
String exchangeData="";
try{
exchangeData =exchanger.exchange(data);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("客戶端原數(shù)據(jù)="+"clientData, "+"交換后的數(shù)據(jù)=" + exchangeData);
}
//測(cè)試類
public static void main(String[] args) {
Demo d =new Demo();
//實(shí)例化Exchanger
Exchanger<String> exchanger =new Exchanger();
//第一個(gè)線程
new Thread(new Runnable() {
@Override
public void run() {
d.serverMethod(exchanger);
}
}).start();
//第二個(gè)線程
new Thread(new Runnable() {
@Override
public void run() {
d.clientMethod(exchanger);
}
}).start();
}
}
2、運(yùn)行main函數(shù),輸出結(jié)果如下:

到此這篇關(guān)于Java并發(fā)工具類Exchanger的相關(guān)知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Java工具類Exchanger內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 利用thymeleaf自定義錯(cuò)誤頁(yè)面
這篇文章主要介紹了SpringBoot 利用thymeleaf自定義錯(cuò)誤頁(yè)面,幫助大家更好的理解和使用springboot 框架,感興趣的朋友可以了解下2020-11-11
SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫(kù)連接池操作
這篇文章主要介紹了SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫(kù)連接池操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot進(jìn)行數(shù)據(jù)加密和解密的詳細(xì)指南
對(duì)稱加密算法使用相同的密鑰進(jìn)行加密和解密,其主要優(yōu)點(diǎn)包括速度快和實(shí)現(xiàn)簡(jiǎn)單,常見(jiàn)的對(duì)稱加密算法有 AES、DES 等,本文將以 AES 為例,展示如何在 Spring Boot 項(xiàng)目中進(jìn)行數(shù)據(jù)加密和解密,需要的朋友可以參考下2024-11-11
spring cloud openfeign 源碼實(shí)例解析
這篇文章主要介紹了spring cloud openfeign 源碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java Web 實(shí)現(xiàn)QQ登錄功能一個(gè)帳號(hào)同一時(shí)間只能一個(gè)人登錄
對(duì)于一個(gè)帳號(hào)在同一時(shí)間只能一個(gè)人登錄,下文給大家介紹的非常詳細(xì),對(duì)java web qq 登錄功能感興趣的朋友一起看看吧2016-11-11
Python安裝Jupyter Notebook配置使用教程詳解
這篇文章主要介紹了Python安裝Jupyter Notebook配置使用教程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

