Java多线程同步问题实例:Semaphore和CountDownLatch使用
在Java中,Semaphore和CountDownLatch都是用于管理多个线程的同步工具。下面是一个具体的实例来说明它们的使用。
Semaphore(信号量)示例:
- 当一个资源可用时,信号量会减少1。
- 当一个线程需要这个资源时,它会尝试获取信号量,如果信号量大于0,那么获取成功,否则表示资源已满,无法获取。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private Semaphore resourceSemaphore = new Semaphore(2);
public void acquireResource() throws InterruptedException {
resourceSemaphore.acquire();
System.out.println("Acquired Resource");
}
public void releaseResource() throws InterruptedException {
resourceSemaphore.release();
System.out.println("Released Resource");
}
}
CountDownLatch(计数down latch)示例:
- CountDownLatch最初的值表示有多少个任务需要完成。
- 当一个线程完成它的任务后,它会调用
countDown()
方法来减少CountDownLatch的值。 - 当CountDownLatch的值变为0时,所有等待该事件的线程都会被唤醒。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
private CountDownLatch taskCompletionSignal = new CountDownLatch(3);
public void startTasks() throws InterruptedException {
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(() -> {
System.out.println("Task " + i + " started");
try {
taskCompletionSignal.countDown();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Task " + i + " completed");
}));
thread.start();
}
}
public void awaitTaskCompletion() throws InterruptedException {
taskCompletionSignal.await();
System.out.println("All tasks completed, awaiting signal release.");
}
}
以上就是Semaphore和CountDownLatch在Java多线程同步中使用的基本实例。
还没有评论,来说两句吧...