- 交换器,两人之间交换数据用的
- 线程之间通信的方式有很多种,这只是其中一种
- 背后有一点CyclicBarrier的概念
- 两个线程都调用了Exchanger的exchange方法,并且这个方法是阻塞的
- 一个线程先执行会将值扔到中间的交换器上,然后阻塞
- 第二个线程也是同样
- 然后两个值互相交换,之后两个线程继续向前跑
- 三个线程只能自己同步,不存在三个线程直接交换的类或方法
- 一个线程调用了exchange,而另一个线程没有调用exchange,那么之前那个线程就会阻塞(等着,什么时候有第二个来了,调用了exchange方法就继续向下)
- 只能两个交换,三个交换要指定交换规则(两两交换?)
- 最常用的就是缓冲这一块
- 原理是AQS吗?**原理不是AQS,是用LockSupport来实现的???**
package com.mashibing.juc.c_020;
import java.util.concurrent.Exchanger;
public class T12_TestExchanger {
static Exchanger<String> exchanger = new Exchanger<>();
public static void main(String[] args) {
new Thread(()->{
String s = "T1";
try {
s = exchanger.exchange(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + s);
}, "t1").start();
new Thread(()->{
String s = "T2";
try {
s = exchanger.exchange(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + s);
}, "t2").start();
}
}