Java并发编程:CountDownLatch、CyclicBarrier详解实例

原创 Love The Way You Lie 2024-11-08 19:24 99阅读 0赞

Java并发编程中,CountDownLatchCyclicBarrier是两个常用的同步辅助类,它们都位于java.util.concurrent包中。下面我将分别解释这两个类,并提供一些实例。

CountDownLatchCountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

特点:

  • 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();
}

latch.await(); //等待所有线程完成 System.out.println(“所有任务完成”);
}

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);
System.out.println(Thread.currentThread().getName() + “任务完成”);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); //任务完成,计数器减1 }
}
}
}
``### CyclicBarrierCyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共屏障点(barrier point)。

特点:

  • CyclicBarrier的计数器可以被重置,因此可以重复使用。
    -它通常用于固定数量的线程需要相互等待的场景。

实例:

```javaimport java.util.concurrent.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;

public class CyclicBarrierExample {
public static void main(String[] args) {
final int threadCount =3;
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(1000);
System.out.println(Thread.currentThread().getName() + “到达屏障点,等待其他线程”);
barrier.await(); //等待其他线程到达屏障点 System.out.println(Thread.currentThread().getName() + “继续执行”);
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
``在这两个例子中,CountDownLatch用于等待所有线程完成,而CyclicBarrier`用于让所有线程在屏障点等待,直到所有线程都到达屏障点后一起继续执行。这两个类在并发编程中非常有用,可以帮助你更好地控制线程间的同步。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,99人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java并发编程概念详解

    *线程和进程** **进程** 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 ...