1、
》》 代码案例:
package multiThread.art;
import java.util.Map;
import java.util.concurrent.*;
/**
* 构造函数: CyclicBarrier(int parties, Runnable barrierAction)
*
* CyclicBarrier 的应用场景:
* CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。例如:用一个 Excel
* 保存了用户所有银行流水,每个 Sheet 保存一个账户近一年的每笔银行流水,现在需要统计
* 用户的日均银行流水,先用多线程处理每个 Sheet 里面的银行流水,都执行完之后,得到每个
* Sheet 的日均银行流水,最后,再用 barrierAction 用这些线程的计算结果,计算出整个
* Excel 的日均银行流水
*/
public class BankWaterService implements Runnable{
/**
* 创建 4 个屏障,处理完之后执行当前类的 run()
*/
private CyclicBarrier c = new CyclicBarrier(4,this);
/**
* 假设只有 4 个 sheet , 所以只启动 4 个线程
*/
private Executor executor = Executors.newFixedThreadPool(4);
/**
* 保存每个 sheet 计算出的银行流水结果
*/
private ConcurrentHashMap<String , Integer> sheetBankWaterCount = new
ConcurrentHashMap<String , Integer>();
private void count(){
for(int i = 0 ; i< 4 ; i++){
executor.execute(new Runnable() {
@Override
public void run() {
/**
* 计算当前 Sheet 的银行流水数据,计算代码省略
*/
sheetBankWaterCount.put(Thread.currentThread().getName() , 1);
/**
* 银行流水计算完成后,插入一个屏障
*/
try {
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void run() {
int result = 0;
for( Map.Entry<String , Integer> sheet : sheetBankWaterCount.entrySet()){
result += sheet.getValue();
}
/**
* 将结果输出
*/
sheetBankWaterCount.put("result",result);
System.out.println(result);
}
public static void main(String[] args) {
BankWaterService bankWaterService = new BankWaterService();
bankWaterService.count();
}
}