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(); } } } }
输出结果:
消费者:我是生产者,我已经生产好产品了,给您!
生产者:我是消费者,我在等待产品,你快点!
实用简单方便