Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解
Exchanger簡介
Exchanger是一個用于線程間協(xié)作的工具類。
Exchanger用于進(jìn)行線程間的數(shù)據(jù)交 換。
它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù)。
這兩個線程通過 exchange方法交換數(shù)據(jù),如果第一個線程先執(zhí)行exchange()方法,它會一直等待第二個線程也 執(zhí)行exchange()方法,當(dāng)兩個線程都到達(dá)同步點時,這兩個線程就可以交換數(shù)據(jù),將本線程生產(chǎn) 出來的數(shù)據(jù)傳遞給對方
Exchanger使用介紹
Exchanger<T>用于在兩個線程之間共享數(shù)據(jù)。該類僅提供一個重載方法exchange(T t),其中exchange(V x, long timeout, TimeUnit unit)方法可以指定阻塞超時時間,下面通過一個來理解兩個線程之間交換數(shù)據(jù):
public class ExchangerDemo { static Exchanger<String> exgr = new Exchanger<>(); public static void main(String[] args) { Thread taskA=new Thread(()->{ try { String message = exgr.exchange("from A"); System.out.println("A Task===>"+ message); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread taskB=new Thread(()->{ try { String message = exgr.exchange("from B"); System.out.println("B Task===>"+ message); } catch (InterruptedException e) { e.printStackTrace(); } }); taskA.start(); taskB.start(); } }
輸出結(jié)果:
線程A,把數(shù)據(jù)傳給了線程B,線程B,把數(shù)據(jù)傳給了線程A
B Task===>from A
A Task===>from B
子線程與主線程間交換數(shù)據(jù)
public class ExchangerDemo2 { static Exchanger<String> exchanger = new Exchanger<>(); public static void main(String[] args) throws InterruptedException { Runnable childTask = () -> { try { String message = exchanger.exchange("來自子線程的數(shù)據(jù)"); System.out.println("子線程: "+message); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); } }; //CompletableFuture java1.8中新增的異步編程類 CompletableFuture<Void> result = CompletableFuture.runAsync(childTask); String msg = exchanger.exchange(" 來自主線程的數(shù)據(jù)"); System.out.println("主線程: " +msg); result.join(); } }
輸出結(jié)果:
子線程: 來自主線程的數(shù)據(jù)
主線程: 來自子線程的數(shù)據(jù)
到此這篇關(guān)于Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)Exchanger線程間交換數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring Boot 目錄文件結(jié)構(gòu)
這篇文章主要介紹了Spring Boot 目錄文件結(jié)構(gòu)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07Spring使用RestTemplate模擬form提交示例
本篇文章主要介紹了Spring使用RestTemplate模擬form提交示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03java中的FileInputStream三種read()函數(shù)用法
這篇文章主要介紹了java中的FileInputStream三種read()函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計
這篇文章主要介紹了Java圖形化編程中的鼠標(biāo)事件設(shè)計,是Java的GUI開發(fā)中的基礎(chǔ)部分,需要的朋友可以參考下2015-10-10基于Java實現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過程解析
這篇文章主要介紹了基于Java實現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12