Exchanger 的使用
1.exchange() 方法阻塞的特點
此方法被調用後等待其他線程來取得數據,如果沒有其他線程取得數據,則一直阻塞等待。
代碼
package com.lhc.concurrent.exchanger.exchange;
import java.util.concurrent.Exchanger;
public class ThreadA extends Thread {
private Exchanger<String> exchanger;
public ThreadA(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println("在線程A中得到線程B的值=" + exchanger.exchange("Chinese A"));
System.out.println("A end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
測試類
package com.lhc.concurrent.exchanger.exchange;
import java.util.concurrent.Exchanger;
public class BlockTest {
public static void main(String[] args){
Exchanger<String> exchanger = new Exchanger<>();
Thread a = new ThreadA(exchanger);
a.start();
System.out.println("main end");
}
}
測試結果
main end
當沒有其他線程來調用時,會阻塞當前線程。
2.exchange() 方法傳遞數據
此方法也可以在不同線程之間傳遞數據
添加代碼
package com.lhc.concurrent.exchanger.exchange;
import java.util.concurrent.Exchanger;
public class ThreadB extends Thread{
private Exchanger<String> exchanger;
public ThreadB(Exchanger<String> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println("在線程B中得到線程A的值=" + exchanger.exchange("Chinese B"));
System.out.println("B end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
修改測試代碼如下:
package com.lhc.concurrent.exchanger.exchange;
import java.util.concurrent.Exchanger;
public class BlockTest {
public static void main(String[] args){
Exchanger<String> exchanger = new Exchanger<>();
Thread a = new ThreadA(exchanger);
Thread b = new ThreadB(exchanger);
a.start();
b.start();
System.out.println("main end");
}
}
測試結果
main end
在線程B中得到線程A的值=Chinese A
B end
在線程A中得到線程B的值=Chinese B
A end
3.exchange() 方法設置超時時間
exchange(V v,long timeout,TimeUnit unit) 方法在指定的時間沒有其他線程獲取數據,則出現超時異常