Java CountDownLatch

描述

运用 Java CountDownLatch 阻塞线程,直到其他线程完成某些处理。

题目

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

  • 线程 A 打印:开始计算。
  • 线程 B :计算 1–100 所有数的累加和,并打印结果。
  • 线程 A 打印:计算完毕。

题目解决思路

  1. 分别创建两个线程类,重写 run 方法。
  2. 线程 A 调用 CountDownLatch 的 await 方法。
  3. 线程 B 运算完毕之后调用 CountDownLatch 的 countDown 方法。

代码具体实现

Thread A 代码:

public class ThreadA extends Thread{ CountDownLatch latch; public ThreadA() { } public ThreadA(String name, CountDownLatch latch) { super(name); this.latch = latch; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ":开始计算..."); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":计算完毕..."); } }

线程 B 代码:

public class ThreadB extends Thread{ CountDownLatch latch; public ThreadB() { } public ThreadB(String name, CountDownLatch latch) { super(name); this.latch = latch; } @Override public void run() { int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; latch.countDown(); } System.out.println(Thread.currentThread().getName() + ":计算 1-100 的和:" + sum); } }

测试代码:

public class Test { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)\n"); CountDownLatch latch = new CountDownLatch(1); ThreadA a = new ThreadA("线程A",latch); ThreadB b = new ThreadB("线程B",latch); a.start(); b.start(); } }

运行结果如下图:

18 Java CountDownLatch.png

以上案例实现线程 A 阻塞,等待线程 B 运算完毕再执行。