iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
1
Software Development

30 天介紹 Java 的 Thread系列 第 12

Day12 使用 Exchanger Class 來交換 Thread 之間的資料

  • 分享至 

  • xImage
  •  

今天要來介紹如何使用 Java 提供內建的 Exchanger class 來交換 Thread 之間的資料。以下先來寫個簡單的 Sample Code 來 Demo 如何使用 Exchanger Class。

import java.util.concurrent.Exchanger;

public class ExchangerExampleThread implements Runnable {
  private Exchanger exchanger;
  private String threadName;
  private String message;

  public ExchangerExampleThread(Exchanger exchanger, String threadName, String message) {
    this.exchanger = exchanger;
    this.threadName = threadName;
    this.message = message;
  }

  @Override
  public void run() {
     try {
       System.out.println("ThreadName:" + threadName + " Message:" + message);
       this.message = (String)this.exchanger.exchange(message);
       System.out.println("ThreadName:" + threadName + " Message:" + message);
     } catch (Exception e) {
        throw new RuntimeException(e);
     }
  }
}

以上的 Thread 程式主要會在建構子裡面接收從外面傳進來的 Exchanger 物件,用來交換不同執行緒的 message,threadName 用來顯示目前是在哪個執行緒上執行。然後在 run 方法會先印出目前的 thread name 以及 message,之後就會執行交換資料的動作。最後再把交換的結果印出來。

以下的程式是呼叫 thread 的主程式,如下:

import java.util.concurrent.Exchanger;

public class Test {
  public static void main(String args[]) {
    Exchanger exchanger = new Exchanger();

    ExchangerExampleThread e1 = new ExchangerExampleThread(exchanger,"thread1", "message1");
    Thread thread1 = new Thread(e1);
    thread1.start();

    ExchangerExampleThread e2 = new ExchangerExampleThread(exchanger,"thread2", "message2");
    Thread thread2 = new Thread(e2);
    thread2.start();
  }
}

主程式的部份會 new 出 Exchanger 的 instance,之後就會把這個 instance 傳給不同的 thread 去做資料交換的部份,執行的結果如下:

ThreadName:thread1 Message:message1
ThreadName:thread2 Message:message2
ThreadName:thread2 Message:message1
ThreadName:thread1 Message:message2

從執行的結果可以看到原本的 thread1 是 mesage1, thread2 是 message2。經過了執行 Exchanger 之後會將資料交換,因此 thread1 會變成 message2, thread2 會變成 message1。

如果把主程式修改成只啟動一個執行緒的程式如下:

import java.util.concurrent.Exchanger;

public class Test {
  public static void main(String args[]) {
    Exchanger exchanger = new Exchanger();

    ExchangerExampleThread e1 = new ExchangerExampleThread(exchanger,"thread1", "message1");
    Thread thread1 = new Thread(e1);
    thread1.start();
  }
}

在這裡的執行結果會只印出以下的字串,然後程式就會進入阻塞的狀態等從另外一個執行緒執行來交換資料。

ThreadName:thread1 Message:message1

Exchanger 適合的使用情境在 Producer-Consumer 模式,明天再為大家來介紹寫這段程式。


上一篇
Day 11 介紹 LinkedBlockingQueue 類別 (二)
下一篇
Day 13 使用 Exchanger 寫 Producer Consumer 程式
系列文
30 天介紹 Java 的 Thread30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言