具体举例使用CountDownLatch
时间: 2023-06-11 14:07:08 浏览: 104
如何使用CountDownLatch同步java多线程
CountDownLatch 是一个 Java 并发包中的工具类,它可以让一个或多个线程等待其他线程执行完毕后再继续执行。具体来说,CountDownLatch 通过一个计数器来实现。在一个或多个线程中调用 CountDownLatch 的 await() 方法等待计数器归零,而在另外的线程中调用 CountDownLatch 的 countDown() 方法将计数器减一,当计数器变为 0 时,所有等待的线程都会被唤醒。
下面是一个简单的例子,假设我们有一个需求:在一个线程中生成 10 个随机数,而另一个线程需要等待这 10 个随机数生成完毕后才能继续执行。我们可以使用 CountDownLatch 来实现这个需求:
```java
import java.util.Random;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
RandomNumberGenerator generator = new RandomNumberGenerator(latch);
ResultProcessor processor = new ResultProcessor(latch);
generator.start();
processor.start();
generator.join();
processor.join();
}
static class RandomNumberGenerator extends Thread {
private final CountDownLatch latch;
public RandomNumberGenerator(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
Random random = new Random();
for (int i = 0; i < 10; i++) {
int randomNumber = random.nextInt(100);
System.out.println("Generated random number: " + randomNumber);
}
latch.countDown();
}
}
static class ResultProcessor extends Thread {
private final CountDownLatch latch;
public ResultProcessor(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
System.out.println("Waiting for random numbers to be generated...");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All random numbers have been generated.");
}
}
}
```
在这个例子中,我们创建了一个 CountDownLatch 对象,并将其计数器初始化为 1。然后我们创建了两个线程:RandomNumberGenerator 线程用于生成随机数,ResultProcessor 线程用于等待随机数生成完毕。在 RandomNumberGenerator 线程中,我们使用 for 循环生成 10 个随机数,并在最后调用 countDown() 方法将计数器减一。在 ResultProcessor 线程中,我们使用 await() 方法等待计数器归零,然后输出一条消息表示随机数已经生成完毕。
需要注意的是,在主线程中我们必须使用 join() 方法等待 RandomNumberGenerator 线程和 ResultProcessor 线程执行完毕,否则程序会直接退出而不会等待它们执行完毕。
阅读全文