Java CyclicBarrier 又称栅栏类,作用是当所有 线程 到达栅栏之后,才打开栅栏。
请使用 CyclicBarrier 编写一个程序,实现以下效果:
要求:线程 D 必须等待前面三个线程执行完毕后才执行。
public class Test {
public static void main(String[] args) {
// 设置结束线程
CyclicBarrier cyclicBarrier = new CyclicBarrier(3,new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 计算完毕");
}
},"线程D"));
// 线程A:计算1--10000的所有数的累加和。
new Thread(new Runnable() {
@Override
public void run() {
try {
int sum = 0;
for (int i = 1; i <= 10000 ; i++) {
sum += i;
}
System.out.println(Thread.currentThread().getName() + " 计算1--10000的所有数的累加和:" + sum);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
},"ThreadA").start();
// 线程B:计算1--10000的所有偶数的累加和。
new Thread(new Runnable() {
@Override
public void run() {
try {
int sum = 0;
for (int i = 1; i <= 10000 ; i++) {
if(i%2 == 0){
sum += i;
}
}
System.out.println(Thread.currentThread().getName() + " 计算1--10000的所有偶数的累加和:" + sum);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
},"ThreadB").start();
// 线程C:计算1--10000的所有奇数的累加和。
new Thread(new Runnable() {
@Override
public void run() {
try {
int sum = 0;
for (int i = 1; i <= 10000 ; i++) {
if(i%2 == 1){
sum += i;
}
}
System.out.println(Thread.currentThread().getName() + " 计算1--10000的所有奇数的累加和:" + sum);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
},"ThreadC").start();
}
}
运行结果如下图:
以上案例实现线程 D 等待所有线程执行完毕后再执行 。