协调线程间同步的类之三----Exchanger 学习笔记

一。

        1>exchanger让两个线程可以互换信息。下面例子表示服务生线程往空的杯子中倒水,顾客线程从装满水的杯子里喝水。然后通过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水。周而复始

        2>注意,一个exchanger只能让两个线程互换信息,线程多了不行,当一个线程到exchanger.exchange()方法而另一个还没到的时候,线程会处于阻塞状态,直到另一个也到了之后一起执行。

        3>个人感觉用处不大,测试代码如下

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();
    }
}



你可能感兴趣的:(协调线程间同步的类之三----Exchanger 学习笔记)