Java并发编程:CountDownLatch深度解析与应用示例

0 下载量 184 浏览量 更新于2024-08-03 收藏 17KB DOCX 举报
"CountDownLatch是一个在Java并发编程中常用的同步工具类,用于协调多个线程间的协作。它基于一个可递减的计数器,初始化时设置为线程的数量。线程开始执行后,每次调用`countDown()`方法,计数器减1。当计数器的值变为0时,所有等待在`await()`方法上的线程会被释放,继续执行。" CountDownLatch的核心在于它的两个主要方法: 1. `await()`: 这个方法使得调用它的线程暂停,进入等待状态,直到计数器归零或当前线程被中断。一旦计数器为0,所有等待的线程都会被唤醒,可以继续执行后续任务。如果在等待期间调用了`interrupt()`方法中断线程,`await()`也会立即返回。 2. `countDown()`: 这个方法由那些完成任务的线程调用,每次调用都会将计数器减1。当计数器达到0时,意味着所有预先设定的任务已经完成,可以解除等待。 此外,`CountDownLatch`还提供了以下辅助方法: - `await(long timeout, TimeUnit unit)`:与`await()`类似,但增加了超时机制。如果在指定的时间内计数器仍未归零,等待的线程将不再阻塞并返回,允许程序继续执行。 - `getCount()`: 返回当前计数器的值,可用于检查还有多少任务未完成。 下面是一个简单的使用CountDownLatch的例子,展示了如何使用它来确保所有工作线程完成后再执行等待线程: ```java public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { // 创建一个CountDownLatch,计数值为3,表示有3个工作线程 CountDownLatch c = new CountDownLatch(3); // 2个等待线程 WaitThread waitThread1 = new WaitThread("wait-thread-1", c); WaitThread waitThread2 = new WaitThread("wait-thread-2", c); // 3个工作线程 Worker worker1 = new Worker("worker-thread-1", c); Worker worker2 = new Worker("worker-thread-2", c); Worker worker3 = new Worker("worker-thread-3", c); // 启动所有线程 waitThread1.start(); waitThread2.start(); Thread.sleep(1000); // 防止主进程过早结束 worker1.start(); worker2.start(); worker3.start(); } } class WaitThread extends Thread { private String name; private CountDownLatch c; public WaitThread(String name, CountDownLatch c) { this.name = name; this.c = c; } @Override public void run() { try { c.await(); // 等待所有工作线程完成 System.out.println(name + " 继续执行"); } catch (InterruptedException e) { e.printStackTrace(); } } } class Worker extends Thread { private String name; private CountDownLatch c; public Worker(String name, CountDownLatch c) { this.name = name; this.c = c; } @Override public void run() { System.out.println(name + " 开始执行"); // 模拟工作 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } c.countDown(); // 工作完成,计数器减1 System.out.println(name + " 完成执行"); } } ``` 在这个例子中,主程序创建了3个工作线程和2个等待线程,并设置了一个初始值为3的CountDownLatch。工作线程执行完后调用`countDown()`,等待线程通过`await()`等待计数器归零。这样,所有工作线程完成后再执行等待线程,实现了线程间的同步。 CountDownLatch在实际应用中非常常见,例如在测试、分布式计算、多线程协同处理等场景下。通过它,开发者可以有效地控制线程的执行顺序和同步,避免数据竞争,提高程序的健壮性。