Exchanger浅谈

简介

Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。他只支持两个线程交换数据,多的不支持。

主要方法

该方法使当前线程等待(休眠状态)另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。  

如果当前线程在进入此方法时已经设置了该线程的中断状态,或者在等待时被中断,则会抛出异常InterruptedException

该方法使当前线程等待(休眠状态)另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。  

InterruptedException:如果档期那线程在等待时被中断

TimeoutException:如果在另一个线程进入交换点之前已经到达指定的等待时间

实例演示:

public class ExchangerDemo {    
    public static void main(String[] args) {
        Exchanger<String> ec = new Exchanger<String>();
        new Producer(ec).start();
        new Consumer(ec).start();
        
    }    
    static class Producer extends Thread{
        List<Integer> list=new ArrayList<Integer>();
        Exchanger<String> ec = null;
        public Producer(Exchanger<String> ec){
            super();
            this.ec = ec;
            this.setName("生产者");
        }
        @Override
        public void run() {
            String r = "我是生产者,我已经生产好产品了,给您!";
            try {
                String c = ec.exchange(r);
                System.out.println(this.getName()+":"+c);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    static class Consumer extends Thread{
        List<Integer> list=new ArrayList<Integer>();
        Exchanger<String> ec = null;
        public Consumer(Exchanger<String> ec){
            super();
            this.ec = ec;
            this.setName("消费者");
        }
        @Override
        public void run() {
            String r = "我是消费者,我在等待产品,你快点!";
            try {
                String p = ec.exchange(r);
                System.out.println(this.getName()+":"+p);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出结果:

  消费者:我是生产者,我已经生产好产品了,给您!
  生产者:我是消费者,我在等待产品,你快点!

实用简单方便

 

posted @ 2017-07-11 11:28  暗夜心慌方  阅读(117)  评论(0编辑  收藏  举报