Exchanger 交换器,用于两个线程之间交换数据。
可以把exchanger想象成一个容器,这个容器有两个值,两个线程,有两个格的位置,第一个线程执行到exchanger.exchange的时候,阻塞,但是要注意exchange方法执行时是往里面传了一个值的,你可以认为把T1扔到第一个格子了,然后第二个线程开始执行,也执行到exchange,他把自己的值T2扔到第二个格子里。接下来这两个值交换一下,T1扔给T2,T2扔给T1,两个线程继续往前运行。
exchange只能是两个线程之间,交换只能两两进行。游戏中两人交易时就可以使用。

public class T07_Exchanger {
// 泛型指定交换类型
static Exchanger<String> exchanger = new Exchanger<>();
public static void main(String[] args) {
new Thread(() -> {
String s = "T1";
try {
// 传入需要交换的对象s,返回交换后的对象
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,返回交换后的对象
s = exchanger.exchange(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + s);
}, "t2").start();
}
}
总结
这里对之前写过的一些juc同步工具做一个简单总结。
- ReentrantLock和synchronized的区别:ReentrantLock 有tryLock(),lockInterruptibly()等方法,用起来更灵活,更方便。
- CountDownLatch门闩,就是倒计时,什么时候计数完了,门闩打开,程序继续往下执行。
- CycliBarrier一个栅栏,循环使用,什么时候人满了,栅栏打开放行。
- Phaser分阶段的栅栏。
- ReadWriteLock读写锁,读锁共享,写锁排他,重点掌握。
- Semaphore信号标,限流用的。
- Exchanger交换器,两个线程之间交换数据。
网友评论