闭锁(CountDownLatch)
是Java中的一个同步辅助类,用于协调多个线程之间的协作。它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
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("所有工作线程已完成。");
}
}
class Worker implements Runnable {
private final CountDownLatch latch;
Worker(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
// 模拟工作线程执行任务
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName() + " 完成任务。");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
latch.countDown(); // 任务完成,计数器减1
}
}
}
import java.util.concurrent.CountDownLatch;
public class ConcurrentTaskExample {
public static void main(String[] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(new Task(startSignal, doneSignal)).start();
}
System.out.println("准备开始...");
startSignal.countDown(); // 所有线程同时开始
doneSignal.await(); // 等待所有线程完成
System.out.println("所有任务已完成。");
}
}
class Task implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Task(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
@Override
public void run() {
try {
startSignal.await(); // 等待开始信号
// 模拟任务执行
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName() + " 执行任务。");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
doneSignal.countDown(); // 任务完成,计数器减1
}
}
}
跳转到:
栅栏(CyclicBarrier)
信号量(Semaphore)