Java并发编程实战:CountDownLatch和CyclicBarrier使用示例
在Java的并发编程中,CountDownLatch和CyclicBarrier都是用于协调多个线程活动的重要工具。
- CountDownLatch:
CountDownLatch最初是由Sun Microsystems引入Java 1.5的一个类。它是一个线程同步工具,表示一个或多个任务完成后会通知所有等待的任务。
使用示例:
import java.util.concurrent.CountDownLatch;
public class CountdownExample {
private CountDownLatch countDownLatch;
public CountdownExample(int count) {
this.countDownLatch = new CountDownLatch(count);
}
public void startTask() throws InterruptedException {
System.out.println("Task started...");
countDownLatch.await();
System.out.println("Task completed.");
}
public static void main(String[] args) {
CountdownExample example = new CountdownExample(3);
// 创建两个线程来执行任务
Thread task1Thread = new Thread(() -> example.startTask()));
Thread task2Thread = new Thread(() -> example.startTask()));
// 启动这两个线程
task1Thread.start();
task2Thread.start();
// 等待所有任务完成后关闭CountDownLatch
countDownLatch.countDown();
}
}
在这个示例中,CountDownLatch
用于协调两个任务。当计数器的值减少到零时,所有等待的任务都会被唤醒。
- CyclicBarrier:
CyclicBarrier是Java并发API提供的一个同步工具。它的主要作用是在一组共享资源需要同时访问的时候提供一种同步机制。
使用示例:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
private CyclicBarrier barrier;
public CyclicBarrierExample(int parties) {
this.barrier = new CyclicBarrier(parties);
}
public void startTask() throws InterruptedException {
System.out.println("Task started...");
barrier.await();
System.out.println("Task completed.");
}
public static void main(String[] args) {
CyclicBarrierExample example = new CyclicBarrierExample(3);
// 创建两个线程来执行任务
Thread task1Thread = new Thread(() -> example.startTask()));
Thread task2Thread = new Thread(() -> example.startTask()));
// 启动这两个线程
task1Thread.start();
task2Thread.start();
// 等待所有任务完成后关闭CyclicBarrier
barrier.await(); // 注意:这个操作会阻塞,直到所有的任务完成并调用await方法。
}
}
在这个示例中,CyclicBarrier
用于协调两个或更多线程的任务。当一个线程进入await()
方法时,它会被阻塞,直到有一个线程成功到达barrier.await();
,然后这个线程会唤醒所有等待的线程。
总结:CountDownLatch和CyclicBarrier都是Java并发编程中常用的同步工具,用于协调多个线程任务的执行顺序。
还没有评论,来说两句吧...