今天要來介紹如何使用 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 模式,明天再為大家來介紹寫這段程式。