CountDownLatch详解
时间: 2023-11-12 10:58:31 浏览: 38
CountDownLatch是Java中的一个同步工具类,它可以让一个或多个线程等待其他线程完成操作后再执行。CountDownLatch内部维护了一个计数器,初始值为指定的数目,每当一个线程完成操作后,计数器就会减1,当计数器为0时,所有等待的线程就会被唤醒。
使用CountDownLatch的步骤如下:
1. 创建CountDownLatch对象,并指定计数器的初始值。
2. 在需要等待的线程中调用await()方法,使线程进入等待状态。
3. 在其他线程中完成操作后,调用countDown()方法,使计数器减1。
4. 当计数器为0时,所有等待的线程都会被唤醒。
相关问题
Android CountDownLatch使用详解
CountDownLatch是Java中的一个同步工具类,用于控制多个线程的执行顺序。它通过一个计数器来实现,该计数器初始化为一个正整数,每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器的值减到0时,所有等待的线程就会被唤醒继续执行。
在Android中,CountDownLatch可以用于等待多个异步操作完成后再执行某个任务,或者等待多个线程都达到某个状态后再继续执行。
下面是CountDownLatch的基本使用方法:
1. 创建CountDownLatch对象,并指定计数器的初始值。
```java
CountDownLatch latch = new CountDownLatch(3); // 计数器初始值为3
```
2. 在需要等待的地方调用`await()`方法,使当前线程进入等待状态,直到计数器值为0时才会继续执行。
```java
try {
latch.await(); // 等待计数器值为0
} catch (InterruptedException e) {
e.printStackTrace();
}
```
3. 在需要通知其他线程继续执行的地方调用`countDown()`方法,将计数器的值减1。
```java
latch.countDown(); // 计数器减1
```
下面是一个简单的示例,演示了如何使用CountDownLatch等待多个线程完成后再执行某个任务:
```java
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
final int threadNum = i;
new Thread(() -> {
try {
Thread.sleep(1000);
System.out.println("Thread " + threadNum + " completed.");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
try {
latch.await();
System.out.println("All threads completed. Start executing the task...");
// 执行任务
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在上面的示例中,我们创建了一个初始值为3的CountDownLatch对象。然后创建了3个线程,每个线程会在执行完任务后将计数器减1。主线程调用`await()`方法等待计数器的值变为0,当所有线程都执行完任务后,主线程才会继续执行并输出"All threads completed. Start executing the task..."。
希望对你有所帮助!
countdownlatch
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。它的原理是使用一个计数器来控制线程的执行顺序。当一个线程执行完自己的任务后,会调用countDown()方法,将计数器的值减一。当计数器的值减为0时,被await()挂起的线程就会被唤醒,继续执行。CountDownLatch常用于一个线程等待其他多个线程完成任务后再继续执行的场景。通过初始化一个全局计数器,可以实现一个线程等待一组线程执行完毕、实现一个线程释放一组线程、或多个线程释放多个线程的效果。这在启动一个服务时,主线程需要等待多个组件加载完毕之后再继续执行的情况下非常有用。<em>1</em><em>2</em><em>3</em>
#### 引用[.reference_title]
- *1* *2* *3* [CountDownLatch详解](https://blog.csdn.net/tianzhonghaoqing/article/details/121139257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item]
[ .reference_list ]