AI绘画关于SD,MJ,GPT,SDXL百科全书
面试题分享点我直达
2023最新面试合集链接
2023大厂面试题PDF
面试题PDF版本
java、python面试题
项目实战:AI文本 OCR识别最佳实践
AI Gamma一键生成PPT工具直达链接
玩转cloud Studio 在线编码神器
玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间
史上最全文档AI绘画stablediffusion资料分享
AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集
AIGC资料包
引言
在并发编程中,我们经常会遇到需要多个线程协同工作的场景。Java提供了两个非常有用的工具类,即CountDownLatch和CyclicBarrier,用于实现线程之间的同步和协作。本文将介绍这两个工具类的区别,并提供相应的代码示例。
- CountDownLatch
CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作后再继续执行。它的主要特点如下:
- CountDownLatch内部维护了一个计数器,初始值为指定的数量。
- 当一个线程完成了自己的任务后,可以调用countDown()方法将计数器减1。
- 当计数器的值变为0时,所有等待的线程将被唤醒,可以继续执行。
下面是一个使用CountDownLatch的示例代码:
在上述代码中,我们创建了一个CountDownLatch对象,并将计数器的初始值设置为5。然后创建了5个线程,每个线程执行一个模拟任务,并在任务完成后调用countDown()方法将计数器减1。最后,主线程调用await()方法等待计数器变为0,即所有线程都完成任务后才继续执行。
- CyclicBarrier
CyclicBarrier也是一个同步辅助类,它允许一组线程相互等待,直到所有线程都到达某个公共屏障点后再继续执行。它的主要特点如下:
- CyclicBarrier内部维护了一个计数器和一个屏障点。
- 当一个线程到达屏障点时,会调用await()方法等待其他线程。
- 当所有线程都到达屏障点时,所有等待的线程将被唤醒,可以继续执行。
下面是一个使用CyclicBarrier的示例代码:
在上述代码中,我们创建了一个CyclicBarrier对象,并将参与线程的数量设置为5。然后创建了5个线程,每个线程执行一个模拟任务,并在任务执行完后调用await()方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会
Your response got cut off, because you only have limited response space. Continue writing exactly where you left off. Do not repeat yourself. Start your response with: ")`方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会", though use backticks where appropriate
USED
Rerun without context
方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会执行传入CyclicBarrier构造函数的Runnable对象,然后所有等待的线程将被唤醒,可以继续执行。
3. 区别对比
虽然CountDownLatch和CyclicBarrier都可以用于线程之间的同步和协作,但它们在使用方式和功能上有一些区别。
- CountDownLatch的计数器只能减少,一旦减到0就不能再增加。而CyclicBarrier的计数器可以循环使用,当计数器减到0时会被重置为初始值。
- CountDownLatch适用于一组线程等待另一组线程完成任务后再继续执行的场景。而CyclicBarrier适用于一组线程相互等待,直到所有线程都到达某个公共屏障点后再继续执行的场景。
- CountDownLatch的计数器是递减的,而CyclicBarrier的计数器是递增的。
- CountDownLatch没有屏障点的概念,所有等待的线程都会被唤醒。而CyclicBarrier有一个屏障点,只有当所有线程都到达屏障点时才会执行指定的动作。
代码示例
CountDownLatch示例代码
java
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(() -> {
// 模拟线程执行任务
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread finished");
latch.countDown(); // 计数器减1
});
thread.start();
}
latch.await(); // 等待计数器变为0
System.out.println("All threads finished");
}
}
java
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int threadCount = 5;
CyclicBarrier barrier = new CyclicBarrier(threadCount, () -> {
System.out.println("All threads reached the barrier");
});
for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(() -> {
// 模拟线程执行任务
try {
Thread.sleep(1000);
System.out.println("Thread reached the barrier");
barrier.await(); // 等待其他线程到达屏障点
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("Thread continued");
});
thread.start();
}
}
}