CountDownLatch源码解析
时间: 2023-11-03 16:02:31 浏览: 48
CountDownLatch是Java并发包中的一个类,它可以用来控制一个或多个线程等待一组事件的完成。CountDownLatch的源码分析可以从其构造方法和两个主要方法(countDown和await)入手。
CountDownLatch的构造方法接收一个整数作为参数,表示需要等待的事件数量。countDown方法用于事件完成时调用,每次调用会将计数器减1。await方法用于等待所有事件完成,当计数器变为0时,await方法才会返回。
在CountDownLatch的源码解析中,可以重点关注countDown方法和await方法的实现。countDown方法通过减少计数器的值来控制事件的完成。await方法则通过等待计数器变为0来实现阻塞。
另外,可以参考《Semaphore源码分析》这篇文章,了解CountDownLatch与Semaphore之间的异同。
相关问题
CountDownLatch类解析
CountDownLatch是Java多线程并发包(java.util.concurrent)中的一个同步辅助类,用于控制线程等待其他线程完成执行之后再继续执行。它可以让某个线程等待其他线程完成各自的工作后再执行,可以用于多线程之间的协调。
CountDownLatch有一个计数器,初始化为一个正整数,每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器的值为0时,表示所有线程都已经完成了任务,此时等待中的线程就可以继续执行。
CountDownLatch有两个主要方法:
1. countDown()方法:将计数器减1,表示一个线程已经完成了任务。
2. await()方法:等待计数器达到0,表示所有线程都已经完成了任务。
下面是一个简单的示例代码,其中有4个线程需要完成各自的任务,主线程需要等待这4个线程全部完成后才能继续执行。
```java
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
final int THREAD_COUNT = 4;
final CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
for (int i = 0; i < THREAD_COUNT; i++) {
new Thread(() -> {
// 模拟线程执行任务
try {
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName() + " 执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 每个线程执行完毕后计数器减1
latch.countDown();
}
}).start();
}
// 主线程等待所有线程执行完毕
latch.await();
System.out.println("所有线程执行完毕");
}
}
```
上述代码中,主线程调用了await()方法,等待所有线程执行完毕后才会继续执行。每个线程执行完毕后会调用countDown()方法,计数器减1。当计数器的值为0时,主线程就可以继续执行了。
CountDownLatch定义源码
CountDownLatch是Java中的一个同步工具类,它可以用于控制多个线程之间的同步。CountDownLatch通过一个计数器来实现,计数器的初始值可以设置为任意正整数,每当一个线程完成了自己的任务后,计数器的值就会减1,当计数器的值变为0时,表示所有线程都已经完成了任务,等待在CountDownLatch上的线程就会被唤醒。
CountDownLatch的定义源码如下:
```java
public class CountDownLatch {
private int count;
public CountDownLatch(int count) {
if (count < 0) {
throw new IllegalArgumentException("count cannot be negative");
}
this.count = count;
}
public void await() throws InterruptedException {
synchronized (this) {
while (count > 0) {
wait();
}
}
}
public void countDown() {
synchronized (this) {
if (count > 0) {
count--;
if (count == 0) {
notifyAll();
}
}
}
}
}
```
在上述代码中,CountDownLatch类维护了一个私有变量count,用于记录当前计数器的值。构造方法CountDownLatch(int count)用于初始化计数器,并且要求count必须为非负数。await()方法用于等待计数器的值变为0,如果计数器的值大于0,则当前线程会进入等待状态。countDown()方法用于将计数器的值减1,并且在计数器的值为0时唤醒所有等待的线程。
使用CountDownLatch可以方便地实现一些多线程并发控制的场景,比如等待多个任务全部完成后再进行下一步操作。