Java CyclicBarrier

描述

Java CyclicBarrier 又称栅栏类,作用是当所有 线程 到达栅栏之后,才打开栅栏。

题目

请使用 CyclicBarrier 编写一个程序,实现以下效果:

  • 线程 A :计算 1–10000 的所有数的累加和。
  • 线程 B :计算 1–10000 的所有偶数的累加和。
  • 线程 C :计算 1–10000 的所有奇数的累加和。
  • 线程 D :计算完毕。

要求:线程 D 必须等待前面三个线程执行完毕后才执行。

题目解决思路

  1. 创建 CyclicBarrier ,设置屏障数和最终执行线程。
  2. 使用 匿名内部类 的方式创建线程,重写 run 方法。
  3. 每个线程运算完毕后,调用 CyclicBarrier 的 await 方法,表示到达屏障。

代码具体实现

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

运行结果如下图:

19 Java CyclicBarrier.png

以上案例实现线程 D 等待所有线程执行完毕后再执行 。