Java并发编程:CountDownLatch与CyclicBarrier的应用实例
在Java的并发编程中,CountDownLatch和CyclicBarrier是两种常用的同步工具。它们用于协调多个线程或任务的执行顺序。
CountDownLatch:
当一个线程因等待某个信号而进入await()
状态时,CountDownLatch会减少计数。当计数器变为0时,所有被阻塞的线程都将被唤醒。CyclicBarrier:
CyclicBarrier用于协调一组线程在达到一定数量后一起执行某个操作。当一个线程调用barriers() throws Exception
来等待到达特定的屏障编号时,该线程将被阻塞。
实例:
import java.util.concurrent.*;
public class CountDownLatchExample {
private final CountDownLatch countDownLatch = new CountDownLatch(2);
public void threadAction(int number) {
try {
// 线程执行逻辑后调用await
countDownLatch.await(number);
System.out.println("Thread " + number + " completed the task");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CountDownLatchExample example = new CountDownLatchExample();
// 创建两个线程
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> future1 = executor.submit(example::threadAction, 1));
Future<Integer> future2 = executor.submit(example::threadAction, 2));
// 等待所有任务完成
try {
future1.get();
future2.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
这个例子中,两个线程分别执行threadAction
方法。当某个线程完成任务并调用await(number)
时,CountDownLatch会减少计数。当计数器变为0时,所有阻塞的线程都会被唤醒并继续执行任务。
还没有评论,来说两句吧...