java併發程式設計JUC第十一篇:如何線上程之間進行對等資料交換

piny發表於2021-09-09

圖片描述

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章