java多线程-java Exchanger线程间交换数据
Exchanger是一个用于线程间协作的工具类。用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程(两个以上的线程不可以)可以彼此交换数据。
这两个线程通过Exchanger的exchanger方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,只有当两个线程都到达同步点时,这两个线程才可以互换数据,将本线程生产出来的数据传递给对方。如下示例we的值123传递给they,they的456值传递给we.
public class ExchangerThreadMain { private static final Exchanger<Integer> exchanger = new Exchanger(); private static ExecutorService threadPool =Executors.newFixedThreadPool(2); public static void main(String[] args) { // TODO Auto-generated method stub threadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int we = 123; try { System.out.println(Thread.currentThread().getName()); //只有两个线程都到达同步点时才可以互相交换数据,如一个线程先到达,则在此等待另一个线程 int they = exchanger.exchange(we); System.out.println(Thread.currentThread().getName()+ " they ="+they); }catch(Exception e) { e.printStackTrace(); } } }); threadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int they = 456; try { System.out.println(Thread.currentThread().getName()); //只有两个线程都到达同步点时才可以互相交换数据,如一个线程先到达,则在此等待另一个线程 int we = exchanger.exchange(they); System.out.println(Thread.currentThread().getName()+ " we ="+we); }catch(Exception e) { e.printStackTrace(); } } }); } }
结果输出:
Exchanger工具类的关键是exchange方法,同步点,只有两个线程都到达此同步点才可以互换数据,我们可以把此同步点当成一个状态,也就是说只有两个线程同时运行至此状态处才可以继续往下执行。如此运用也可以实现两个线程之的CountDownLatch应用。
版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论