一。java
1>exchanger让两个线程能够互换信息。下面例子表示服务生线程往空的杯子中倒水,顾客线程从装满水的杯子里喝水。而后经过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水。周而复始ide
2>注意,一个exchanger只能让两个线程互换信息,线程多了不行,当一个线程到exchanger.exchange()方法而另外一个还没到的时候,线程会处于阻塞状态,直到另外一个也到了以后一块儿执行。
测试
3>我的感受用处不大,测试代码以下this
public class ExchangerTest { public static class Cup{ private boolean isfull=false; public Cup(boolean isfull){ this.isfull=isfull; } //添水用5s public void addWater(){ if(!this.isfull){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } this.isfull=true; } } public void drinkWater(){ if(this.isfull){ try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } isfull=false; } } } public static void testExchanger() { final Exchanger<Cup> exchanger=new Exchanger<Cup>();//姑且叫他交换机 吧 final Cup initailEmptyCup=new Cup(false);//初始的空杯子 final Cup initailFullCup=new Cup(true);//初始的满杯子 class Waiter implements Runnable{ @Override public void run() { Cup currentCup=initailEmptyCup; int i=0; while(i<2){ System.out.println("服务生添水:"+i); currentCup.addWater(); System.out.println("服务生添水完毕,等待交换杯子"); try { currentCup=exchanger.exchange(currentCup); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("交换杯子完毕"+System.currentTimeMillis()); i++; } } } class Consumer implements Runnable{ @Override public void run() { Cup cup=initailFullCup; int i=0; while(i<2){ System.out.println("顾客开始喝水:"+i); cup.drinkWater(); System.out.println("顾客喝水完毕,等待交换杯子"); try { cup=exchanger.exchange(cup); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("顾客与服务生交换杯子完毕"+System.currentTimeMillis()); i++; } } } new Thread(new Waiter()).start(); new Thread(new Consumer()).start(); } public static void main(String[] args) { testExchanger(); } }