java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器
java.util.concurrent.Exchanger可以用來進(jìn)行數(shù)據(jù)交換,或者被稱為“數(shù)據(jù)交換器”。兩個(gè)線程可以使用Exchanger交換數(shù)據(jù),下圖用來說明Exchanger的作用

在下面的代碼中
- 首先我們定義了一個(gè)Exchanger,用于數(shù)據(jù)交換
- 然后定義了兩個(gè)線程對象bookExchanger1和bookExchanger2,兩個(gè)線程都持有Exchanger交換器對象用于數(shù)據(jù)交換
- 兩個(gè)線程中的每個(gè)線程都有自己的數(shù)據(jù),比如下面代碼中的String[] 書籍?dāng)?shù)組。
public static void main(String[] args) {
//數(shù)據(jù)交換器-數(shù)據(jù)為book
Exchanger<String> exchanger = new Exchanger<>();
//換書線程1
BookExchanger bookExchanger1
= new BookExchanger(exchanger, new String[]{"Java從入門到放棄","Java編程思想"});
//換書線程2
BookExchanger bookExchanger2
= new BookExchanger(exchanger, new String[]{"C語言程序設(shè)計(jì)","實(shí)戰(zhàn)Python數(shù)據(jù)分析"});
new Thread(bookExchanger1).start();
new Thread(bookExchanger2).start();
}
BookExchanger 繼承自Runnable代表參與換書的換書讀者,他持有Exchanger數(shù)據(jù)交換器用于交換圖書。
public class BookExchanger implements Runnable{
Exchanger<String> exchanger = null; //數(shù)據(jù)交換器
String[] books = null; //圖書數(shù)組
public BookExchanger(Exchanger<String> exchanger, String[] books) {
this.exchanger = exchanger;
this.books = books;
}
@Override
public void run() {
try {
for(String bookName : books) {
//交換數(shù)據(jù),bookName為我的書,exBook為我換回來的書
String exBook = this.exchanger.exchange(bookName);
System.out.println(
Thread.currentThread().getName() +
" 用《 " + bookName + "》 換 《 " + exBook + "》"
);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
執(zhí)行上文中的代碼,得到如下的打印輸出??梢钥吹街挥袃蓚€(gè)線程完成一次交換之后,才能再進(jìn)行下一次的交換。
Thread-1 用《 C語言程序設(shè)計(jì)》 換 《 Java從入門到放棄》
Thread-0 用《 Java從入門到放棄》 換 《 C語言程序設(shè)計(jì)》
Thread-1 用《 實(shí)戰(zhàn)Python數(shù)據(jù)分析》 換 《 Java編程思想》
Thread-0 用《 Java編程思想》 換 《 實(shí)戰(zhàn)Python數(shù)據(jù)分析》
以上就是java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器的詳細(xì)內(nèi)容,更多關(guān)于java并發(fā)Exchanger數(shù)據(jù)交換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在JAVA?Web項(xiàng)目中動(dòng)態(tài)加載DLL/SO文件的方法
在JAVA?Web項(xiàng)目中,我們經(jīng)常需要調(diào)用一些第三方庫或者實(shí)現(xiàn)一些JAVA本身不支持的功能,這時(shí),我們可能會(huì)考慮使用JNI來調(diào)用DLL或SO文件,然而,因此,本文將介紹如何在JAVA?Web項(xiàng)目中動(dòng)態(tài)加載DLL/SO文件,需要的朋友可以參考下2024-12-12
Java 基于tcp協(xié)議實(shí)現(xiàn)文件上傳
這篇文章主要介紹了Java 基于tcp協(xié)議實(shí)現(xiàn)文件上傳,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
Spring boot集成Go-FastDFS實(shí)現(xiàn)圖片上傳刪除等功能實(shí)現(xiàn)
這篇文章主要介紹了Spring boot集成Go-FastDFS實(shí)現(xiàn)圖片上傳刪除等功能實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Java實(shí)現(xiàn)調(diào)用jython執(zhí)行python文件的方法
這篇文章主要介紹了Java實(shí)現(xiàn)調(diào)用jython執(zhí)行python文件的方法,結(jié)合實(shí)例形式分析了Java調(diào)用jython執(zhí)行python文件的常見操作技巧及相關(guān)問題解決方法,需要的朋友可以參考下2018-03-03
springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerCont
這篇文章主要介紹了springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available),通過分析錯(cuò)誤信息、排查代碼和配置,找出問題的根源,并給出相應(yīng)的解決方案,感興趣的可以了解一下2024-01-01

