1. 程式人生 > >Java併發(十六):併發工具類——Exchanger

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

 

 

併發工具類(四)兩個執行緒進行資料交換的Exchanger

【死磕Java併發】—–J.U.C之併發工具類:Exchanger