Java并發(fā)工具類Exchanger的相關(guān)知識總結(jié)
一、Exchanger的理解
- Exchanger 屬于java.util.concurrent包;
- Exchanger 是 JDK 1.5 開始提供的一個用于兩個工作線程之間交換數(shù)據(jù)的封裝工具類;
- 一個線程在完成一定的事務(wù)后想與另一個線程交換數(shù)據(jù),則第一個先拿出數(shù)據(jù)的線程會一直等待第二個線程,直到第二個線程拿著數(shù)據(jù)到來時才能彼此交換對應(yīng)數(shù)據(jù)。
二、Exchanger類中常用方法
- public Exchanger() 無參構(gòu)造方法。表示創(chuàng)建一個新的交換器。
- public V exchange(V x) 等待另一個線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為 interrupted ),然后將給定對象傳輸給它,接收其對象作為回報。
(1)、x :表示可以交換的對象
- public V exchange(V x, long timeout, TimeUnit unit) 等待另一個線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為 interrupted或指定的等待時間已過),然后將給定對象傳輸給它,接收其對象作為回報。
(1)、 x :交換對象
(2)、timeout :等待的最長時間
(3)、unit :timeout參數(shù)的時間單位
三、Exchanger類的使用示例
案例場景
模擬客戶端和服務(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 { //定義一個服務(wù)端方法 public void serverMethod(Exchanger<String> exchanger){ System.out.println("【服務(wù)端】方法開始執(zhí)行"); //睡眠1秒鐘 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //定義服務(wù)端數(shù)據(jù) String data="serverData"; //等待另一個線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為interrupted),然后將給定對象傳輸給它,接收其對象作為回報。 String exchangeData=""; try { exchangeData=exchanger.exchange(data); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("服務(wù)端原數(shù)據(jù)="+"serverData,"+" 交換后的數(shù)據(jù)=" + exchangeData); } //定義一個客戶端方法 public void clientMethod(Exchanger<String> exchanger){ System.out.println("【客戶端】方法開始執(zhí)行"); //睡眠3秒鐘 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //定義客戶端數(shù)據(jù) String data="clientData"; //等待另一個線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程為interrupted),然后將給定對象傳輸給它,接收其對象作為回報。 String exchangeData=""; try{ exchangeData =exchanger.exchange(data); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("客戶端原數(shù)據(jù)="+"clientData, "+"交換后的數(shù)據(jù)=" + exchangeData); } //測試類 public static void main(String[] args) { Demo d =new Demo(); //實例化Exchanger Exchanger<String> exchanger =new Exchanger(); //第一個線程 new Thread(new Runnable() { @Override public void run() { d.serverMethod(exchanger); } }).start(); //第二個線程 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)知識總結(jié)的文章就介紹到這了,更多相關(guān)Java工具類Exchanger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Http請求方式之RestTemplate常用方法詳解
這篇文章主要為大家介紹了Java?Http請求方式之RestTemplate常用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09spring-boot-maven-plugin?配置有啥用
這篇文章主要介紹了spring-boot-maven-plugin?配置是干啥的,這個是SpringBoot的Maven插件,主要用來打包的,通常打包成jar或者war文件,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理
這篇文章主要介紹了RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理,業(yè)務(wù)實現(xiàn)消費(fèi)回調(diào)的時候,當(dāng)且僅當(dāng)此回調(diào)函數(shù)返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS ,RocketMQ才會認(rèn)為這批消息(默認(rèn)是1條)是消費(fèi)完成的,需要的朋友可以參考下2023-10-10Mybatis 如何批量刪除數(shù)據(jù)的實現(xiàn)示例
這篇文章主要介紹了Mybatis 如何批量刪除數(shù)據(jù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03