目标:利用CyclicBarrier进行任务拆分与整合
CyclicBarrier
- 循环栅栏:让一组同时运行的线程到达栅栏阻塞,直到全部线程都到达(可执行一段同步程序),然后继续执行。
- new CyclicBarrier(int val, Runnable):val为线程数,Runnable为同步时的执行程序。
- await():线程内执行await()时就会进行阻塞,等待其他线程全部到达屏障。
代码实现:
package com.miracle.study.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @author Miracle
* @date 2021/4/14 19:42
*/
public class CyclicBarrierTest {
static class Task1 implements Runnable{
public CyclicBarrier cyclicBarrier;
/**
* 运算次数
*/
public int num;
/**
* 任务名称
*/
private String name;
public Task1(CyclicBarrier cyclicBarrier, int num, String name){
this.cyclicBarrier = cyclicBarrier;
this.num = num;
this.name = name;
}
@Override
public void run() {
while (num != 0){
try {
System.out.println("run " + this.name);
Thread.sleep(100);
System.out.println("stop " + this.name);
// 阻塞等待其他线程完成任务
cyclicBarrier.await();
// 次数减一
num--;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(4, () -> {
// 所有任务完成后,会调用这个任务,然后所有线程继续执行。
System.out.println("Check task completion");
});
new Thread(new Task1(cyclicBarrier, 10, "task01")).start();
new Thread(new Task1(cyclicBarrier, 10, "task02")).start();
new Thread(new Task1(cyclicBarrier, 10, "task03")).start();
new Thread(new Task1(cyclicBarrier, 10, "task04")).start();
}
}