Java并发(十六):并发工具类——Exchanger
Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。
举例
class ExchangerTest { static class Producer implements Runnable { // 生产者、消费者交换的数据结构 private List<String> buffer; // 步生产者和消费者的交换对象 private Exchanger<List<String>> exchanger; Producer(List<String> buffer, Exchanger<List<String>> exchanger) { this.buffer = buffer; this.exchanger = exchanger; } @Override public void run() { for (int i = 1; i < 5; i++) { for (int j = 1; j <= 3; j++) { System.out.println("生产者装入" + i + "--" + j); buffer.add("buffer:" + i + "--" + j); } System.out.println("生产者装满,等待与消费者交换..."); try { exchanger.exchange(buffer); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("生产者 " + i + ":" + buffer); } } } static class Consumer implements Runnable { private List<String> buffer; private final Exchanger<List<String>> exchanger; public Consumer(List<String> buffer, Exchanger<List<String>> exchanger) { this.buffer = buffer; this.exchanger = exchanger; } @Override public void run() { for (int i = 1; i < 5; i++) { // 调用exchange()与消费者进行数据交换 try { buffer = exchanger.exchange(buffer); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("消费者第" + i + "次提取"); for (int j = 1; j <= 3; j++) { System.out.println("消费者 : " + buffer.get(0)); buffer.remove(0); } } } } public static void main(String[] args) { List<String> buffer1 = new ArrayList<String>(); List<String> buffer2 = new ArrayList<String>(); Exchanger<List<String>> exchanger = new Exchanger<List<String>>(); Thread producerThread = new Thread(new Producer(buffer1, exchanger)); Thread consumerThread = new Thread(new Consumer(buffer2, exchanger)); producerThread.start(); consumerThread.start(); } }
【死磕Java并发】—–J.U.C之并发工具类:Exchanger
技术在于学习 在于实践 在于总结 在于分享