應用場景
如果兩個線程在運行過程中需要交換彼此的信息,可以使用Exchanger這個類。
Exchanger爲線程交換信息提供了非常方便的途徑,它可以作爲兩個線程交換對象的同步點,只有當每個線程都在進入 exchange ()方法並給出對象時,才能接受其他線程返回時給出的對象。
使用方法
Exchanger的構造方法如下:
- Exchanger(); //創建一個新的 Exchanger。
Exchanger用到的主要方法有:
exchange(V x); //等待另一個線程到達此交換點(除非它被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。
exchange(V x, long timeout, TimeUnit unit); // 等待另一個線程到達此交換點(除非它被中斷,或者超出了指定的等待時間),然後將給定的對象傳送給該線程,同時接收該線程的對象。
實例代碼
package Exchanger;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Exechanger {
public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
Exchanger<String> exchanger=new Exchanger<>();
new Thread() {
@Override
public void run() {
String data1="data1";
try {
System.out.println(Thread.currentThread().getName()+"交換前的數據:"+data1);
String data2=exchanger.exchange(data1);
System.out.println(Thread.currentThread().getName()+"交換後的數據:"+data2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override
public void run() {
String data2="data2";
try {
System.out.println(Thread.currentThread().getName()+"交換前的數據:"+data2);
String data1=exchanger.exchange(data2);
System.out.println(Thread.currentThread().getName()+"交換後的數據:"+data1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}