01交換者の役割
2つのスレッド間でデータを転送します。(3つ以上のスレッドではなく2つのスレッドの間に右)
02一般的な方法
exchange()
現在のスレッドをブロックし、他のスレッドがデータをフェッチするのを待ち、他のスレッドがデータをフェッチしない場合は待機します。
exchange()
データを渡す
exchange(V v, long timeout, TimeUnit unit)
指定された時間内にメッセージが受信されない場合、タイムアウト例外がスローされます。
03例
package com.page.concurrent.exchanger;
import java.util.concurrent.Exchanger;
public class Worker extends Thread {
private final String name;
Exchanger<String> exchanger;
public Worker(String name, Exchanger<String> exchanger) {
this.name = name;
this.exchanger = exchanger;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : " +
System.currentTimeMillis() +
" " + name +
" waiting message.");
try {
String exchange = exchanger.exchange("I'm " + name);
System.out.println(name + " get message : " + exchange);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
复制代码
package com.page.concurrent.exchanger;
import java.util.concurrent.Exchanger;
public class App {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
for (int i = 1; i <= 2; i++) {
new Worker("people-" + i, exchanger)
.start();
}
}
}
复制代码