Exchanger?
- Exchanger用于進行線程間的數據交換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數據
- 兩個線程通過exchange方法交換數據,如果一個線程先執行exchange方法,它會一直等待第二個線程也執行exchange方法
- 當兩個線程都達到同步點時,這兩個線程就可以交換數據,將本線程生產出來的數據傳遞給對方(只能在兩個線程之間交換數據)
使用場景
- 遺傳算法:遺傳算法里需要選出兩個人作為交換對象,這時會交換兩人的數據,并使用交叉規則得出兩個人交換結果。
- 校對工作:A、B同時錄入數據,然后對A、B進行比較,看是否錄入一致,保證數據正確性
package com.example.core.juc;import org.springframework.jmx.export.naming.IdentityNamingStrategy;import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class UseExchanger {private static final Exchanger<String> exchanger = new Exchanger<>();//Exchanger<String>交換String類型//Exchanger用于兩個數據之間的數據交換private static ExecutorService executorService = Executors.newFixedThreadPool(2);public static void main(String[] args) {executorService.execute(new Runnable() {@Overridepublic void run() {String A = "銀行流水A";try{String B = exchanger.exchange(A);//交換我自己的數據,并且獲取別人的數據System.out.println("線程A:"+B);}catch (InterruptedException w){w.printStackTrace();}}});executorService.execute(new Runnable() {@Overridepublic void run() {String B = "銀行流水B";try{String A = exchanger.exchange(B);//交換我自己的數據,并且獲取別人的數據System.out.println("線程B:"+A);}catch (InterruptedException w){w.printStackTrace();}}});executorService.shutdown();//關閉線程池}
}
/*
output:
線程B:銀行流水A
線程A:銀行流水B*/
?