Java并发编程:CountDownLatch和CyclicBarrier使用实例
Java并发编程中,CountDownLatch
和CyclicBarrier
是两个常用的同步辅助类,它们可以帮助协调多个线程之间的操作。下面我将分别给出这两个类的使用实例。
CountDownLatch 使用实例CountDownLatch
是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
场景:假设我们有一个主线程,需要等待三个工作线程完成各自的任务后,才能继续执行。
```javaimport java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
final int threadCount =3;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i =0; i < threadCount; i++) {
new Thread(new Worker(latch)).start();
}
try {
latch.await(); //等待所有线程完成 System.out.println(“所有工作线程已完成”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class Worker implements Runnable {
private final CountDownLatch latch;
public Worker(CountDownLatch latch) {
this.latch = latch;
}
@Override public void run() {
try {
//模拟工作线程执行任务 System.out.println(Thread.currentThread().getName() + “正在执行任务”);
Thread.sleep(1000); //模拟耗时操作} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); //任务完成,计数减一 }
}
}
}``### CyclicBarrier 使用实例
CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共屏障点(barrier point)。
场景:假设我们有五个线程,它们需要在开始下一轮工作前,等待其他线程完成当前轮次的工作。
```javaimport java.util.concurrent.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
public class CyclicBarrierExample {
public static void main(String[] args) {
final int threadCount =5;
CyclicBarrier barrier = new CyclicBarrier(threadCount, new Runnable() {
@Override public void run() {
System.out.println(“所有线程已到达屏障点,可以开始下一轮工作”);
}
});
for (int i =0; i < threadCount; i++) {
new Thread(new Worker(barrier)).start();
}
}
static class Worker implements Runnable {
private final CyclicBarrier barrier;
public Worker(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override public void run() {
try {
//模拟工作线程执行任务 System.out.println(Thread.currentThread().getName() + “正在执行任务”);
Thread.sleep((long) (Math.random() *1000)); //模拟耗时操作 barrier.await(); //等待其他线程到达屏障点//继续执行下一轮工作 System.out.println(Thread.currentThread().getName() + “继续执行下一轮工作”);
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}``在这两个例子中,
CountDownLatch适用于一次性的等待场景,而
CyclicBarrier`适用于需要重复等待的场景。使用这些工具可以帮助你更好地管理和协调多线程程序中的线程同步问题。
还没有评论,来说两句吧...