1. 交换器,两人之间交换数据用的
    2. 线程之间通信的方式有很多种,这只是其中一种
    3. 背后有一点CyclicBarrier的概念
    4. 两个线程都调用了Exchanger的exchange方法,并且这个方法是阻塞
    5. 一个线程先执行会将值扔到中间的交换器上,然后阻塞
    6. 第二个线程也是同样
    7. 然后两个值互相交换,之后两个线程继续向前跑
    8. 三个线程只能自己同步,不存在三个线程直接交换的类或方法
    9. 一个线程调用了exchange,而另一个线程没有调用exchange,那么之前那个线程就会阻塞(等着,什么时候有第二个来了,调用了exchange方法就继续向下)
    10. 只能两个交换,三个交换要指定交换规则(两两交换?)
    11. 最常用的就是缓冲这一块
    12. 原理是AQS吗?**原理不是AQS,是用LockSupport来实现的???**

    image.png

    1. package com.mashibing.juc.c_020;
    2. import java.util.concurrent.Exchanger;
    3. public class T12_TestExchanger {
    4. static Exchanger<String> exchanger = new Exchanger<>();
    5. public static void main(String[] args) {
    6. new Thread(()->{
    7. String s = "T1";
    8. try {
    9. s = exchanger.exchange(s);
    10. } catch (InterruptedException e) {
    11. e.printStackTrace();
    12. }
    13. System.out.println(Thread.currentThread().getName() + " " + s);
    14. }, "t1").start();
    15. new Thread(()->{
    16. String s = "T2";
    17. try {
    18. s = exchanger.exchange(s);
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. }
    22. System.out.println(Thread.currentThread().getName() + " " + s);
    23. }, "t2").start();
    24. }
    25. }