Java多线程同步问题实例:Semaphore和CountDownLatch使用

原创 逃离我推掉我的手 2024-11-30 12:33 92阅读 0赞

在Java中,Semaphore和CountDownLatch都是用于管理多个线程的同步工具。下面是一个具体的实例来说明它们的使用。

Semaphore(信号量)示例:

  • 当一个资源可用时,信号量会减少1。
  • 当一个线程需要这个资源时,它会尝试获取信号量,如果信号量大于0,那么获取成功,否则表示资源已满,无法获取。
  1. import java.util.concurrent.Semaphore;
  2. public class SemaphoreExample {
  3. private Semaphore resourceSemaphore = new Semaphore(2);
  4. public void acquireResource() throws InterruptedException {
  5. resourceSemaphore.acquire();
  6. System.out.println("Acquired Resource");
  7. }
  8. public void releaseResource() throws InterruptedException {
  9. resourceSemaphore.release();
  10. System.out.println("Released Resource");
  11. }
  12. }

CountDownLatch(计数down latch)示例:

  • CountDownLatch最初的值表示有多少个任务需要完成。
  • 当一个线程完成它的任务后,它会调用countDown()方法来减少CountDownLatch的值。
  • 当CountDownLatch的值变为0时,所有等待该事件的线程都会被唤醒。
  1. import java.util.concurrent.CountDownLatch;
  2. public class CountDownLatchExample {
  3. private CountDownLatch taskCompletionSignal = new CountDownLatch(3);
  4. public void startTasks() throws InterruptedException {
  5. for (int i = 0; i < 3; i++) {
  6. Thread thread = new Thread(() -> {
  7. System.out.println("Task " + i + " started");
  8. try {
  9. taskCompletionSignal.countDown();
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. System.out.println("Task " + i + " completed");
  14. }));
  15. thread.start();
  16. }
  17. }
  18. public void awaitTaskCompletion() throws InterruptedException {
  19. taskCompletionSignal.await();
  20. System.out.println("All tasks completed, awaiting signal release.");
  21. }
  22. }

以上就是Semaphore和CountDownLatch在Java多线程同步中使用的基本实例。

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

发表评论

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

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

相关阅读