交换(Exchange)顾名思义,就是用来在两个线程之间交换数据的。它诞生于JDK1.5。它有两个核心方法:exchange(Vx):等待另一个线程到达这个exchangePoint,然后将对象传递给另一个线程,从另一个线程获取交换的对象。如果另一个线程没有到达这个切换点,那么这个线程将永远休眠(除非遇到线程中断)。exchange(Vx,longtimeout,TimeUnitunit):等待另一个线程到达这个交换点,然后将对象传递给另一个线程,从另一个线程获取交换的对象。如果另一个线程没有到达这个切换点,那么这个线程就会休眠,直到遇到线程中断,或者等待时间超过设定的时间,就会抛出异常。也就是说exchange方法是一个交换点,线程会在这个交换点等待,直到另一个线程也调用了exchange方法(相当于进入了这个交换点),然后他们交换数据,然后执行后续代码。基本使用Exchange的基本使用如下。我们创建两个线程来模拟“单手支付,单手发货”的场景。线程1先准备好钱进入兑换点,2s后等待线程2准备好商品(东西),然后互相交换数据,执行后续流程。具体实现代码如下:importjava.time.LocalDateTime;导入java.util.concurrent.Exchanger;publicclassExchangeExample{//创建一个交互器privatefinalstaticExchangerexchange=newExchanger<>();publicstaticvoidmain(String[]args){//Thread1[准备资金]newThread(()->{System.out.println("Thread1:preparingtoraisemoney...|Time:"+LocalDateTime.now());try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}Stringmoeny="1000万";System.out.println("Thread1:钱是准备好[1000万]。|Time:"+LocalDateTime.now());try{//执行数据交换[transaction]Stringresult=exchange.exchange(moeny);System.out.println("Thread1:transactioncompleted,get【"+result+"】|Time:"+LocalDateTime.now());}catch(InterruptedExceptione){e.printStackTrace();}}).start();//线程2【准股】newThread(()->{System.out.println("线程2:准备物品[西伯利亚新鲜空气]...|时间:"+LocalDateTime.now());try{Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}Stringgoods="西伯利亚新鲜空气";System.out.println("线程2:货物准备好【西伯利亚新鲜空气】。|Time:"+LocalDateTime.now());try{//执行数据交换[transaction]Stringresult=exchange.exchange(goods);System.out.println("线程2:交易完成,get【"+result+"】|Time:"+LocalDateTime.now());}catch(InterruptedExceptione){e.printStackTrace();}}).start();}}上面程序的执行结果如下:总结Exchangeswitch的作用是用来实现两个线程之间的数据交换,Exchanger可以交换任何数据类型的数据,只要在创建的时候定义了泛型即可。它的核心方法是exchange,当线程执行这个方法时,它会sleep等待另一个线程也进入交换点,如果另一个线程也进入交换点(并执行exchange方法),两者就会交换数据,执行后续流程。