java併發程式設計JUC第十一篇:如何線上程之間進行對等資料交換
java.util.concurrent.Exchanger
可以用來進行資料交換,或者被稱為“資料交換器”。兩個執行緒可以使用Exchanger交換資料,下圖用來說明Exchanger的作用
在下面的程式碼中
- 首先我們定義了一個Exchanger,用於資料交換
- 然後定義了兩個執行緒物件bookExchanger1和bookExchanger2,兩個執行緒都持有Exchanger交換器物件用於資料交換
- 兩個執行緒中的每個執行緒都有自己的資料,比如下面程式碼中的String[] 書籍陣列。
public static void main(String[] args) {
//資料交換器-資料為book
Exchanger exchanger = new Exchanger();
//換書執行緒1
BookExchanger bookExchanger1
= new BookExchanger(exchanger, new String[]{"Java從入門到放棄","Java程式設計思想"});
//換書執行緒2
BookExchanger bookExchanger2
= new BookExchanger(exchanger, new String[]{"C語言程式設計","實戰Python資料分析"});
new Thread(bookExchanger1).start();
new Thread(bookExchanger2).start();
}
BookExchanger 繼承自Runnable代表參與換書的換書讀者,他持有Exchanger資料交換器用於交換圖書。
public class BookExchanger implements Runnable{
Exchanger exchanger = null; //資料交換器
String[] books = null; //圖書陣列
public BookExchanger(Exchanger exchanger, String[] books) {
this.exchanger = exchanger;
this.books = books;
}
@Override
public void run() {
try {
for(String bookName : books) {
//交換資料,bookName為我的書,exBook為我換回來的書
String exBook = this.exchanger.exchange(bookName);
System.out.println(
Thread.currentThread().getName() +
" 用《 " + bookName + "》 換 《 " + exBook + "》"
);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
執行上文中的程式碼,得到如下的列印輸出。可以看到只有兩個執行緒完成一次交換之後,才能再進行下一次的交換。
Thread-1 用《 C語言程式設計》 換 《 Java從入門到放棄》
Thread-0 用《 Java從入門到放棄》 換 《 C語言程式設計》
Thread-1 用《 實戰Python資料分析》 換 《 Java程式設計思想》
Thread-0 用《 Java程式設計思想》 換 《 實戰Python資料分析》
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載註明出處(必須帶連線,不能只轉文字):[字母哥部落格] 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2797958/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java併發程式設計JUC第十篇:CyclicBarrier執行緒同步Java程式設計執行緒
- java併發程式設計JUC第十二篇:AtomicInteger原子整型Java程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- java併發程式設計工具類JUC第一篇:BlockingQueue阻塞佇列Java程式設計BloC佇列
- 併發工具類(四)執行緒間的交換資料 Exchanger執行緒
- 併發程式設計之:JUC併發控制工具程式設計
- Java併發程式設計序列之JUC底層AQSJava程式設計AQS
- Java併發程式設計序列之JUC中Condition執行緒通訊Java程式設計執行緒
- java併發程式設計JUC第九篇:CountDownLatch執行緒同步Java程式設計CountDownLatch執行緒
- 突擊併發程式設計JUC系列-併發工具 Semaphore程式設計
- java併發程式設計工具類JUC第八篇:ConcurrentHashMapJava程式設計HashMap
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueueJava程式設計BloC
- .NET併發程式設計-資料並行程式設計並行
- Java併發程式設計:Java執行緒Java程式設計執行緒
- 併發王者課-鉑金9:互通有無-Exchanger如何完成執行緒間的資料交換執行緒
- JUC併發程式設計詳解(通俗易懂)程式設計
- Java 併發程式設計:如何防止線上程阻塞與喚醒時死鎖Java程式設計
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- 併發程式設計進階程式設計
- JUC併發程式設計之Semaphore、CountDownLatch、CyclicBarrier協同工具程式設計CountDownLatch
- 併發程式設計——Java執行緒的6種狀態及切換程式設計Java執行緒
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- Java併發程式設計:執行緒池ThreadPoolExecutorJava程式設計執行緒thread
- java併發程式設計工具類JUC第三篇:DelayQueue延時佇列Java程式設計佇列
- Java併發程式設計—ThreadLocalJava程式設計thread
- Java併發程式設計:synchronizedJava程式設計synchronized
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計 -- ConditionJava程式設計
- Java併發程式設計——ThreadLocalJava程式設計thread
- java-併發程式設計Java程式設計
- Java 併發程式設計解析Java程式設計
- Java併發程式設計-CASJava程式設計
- Java併發程式設計:LockJava程式設計