Spring CountDownLatch 类

发布于 2024-10-28 14:36:03 字数 2507 浏览 6 评论 0

CountDownLatch 是通过 共享锁 实现的。在创建 CountDownLatch 中时,会传递一个 int 类型参数 count,该参数是 锁计数器 的初始状态,表示该 共享锁 最多能被 count 给线程同时获取。当某线程调用该 CountDownLatch 对象的 await() 方法时,该线程会等待 共享锁 可用时,才能获取 共享锁 进而继续运行。

共享锁 可用的条件,就是 锁计数器 的值为 0!而 锁计数器 的初始值为 count,每当一个线程调用该 CountDownLatch 对象的 countDown() 方法时,才将 锁计数器 -1;通过这种方式,必须有 count 个线程调用 countDown() 之后, 锁计数器 才为 0,而前面提到的等待线程才能继续运行!

CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务 A,它要等待其他 4 个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch 来实现这种功能了。

CountDownLatch 类只提供了一个构造器:

public CountDownLatch(int count) {};  // 参数 count 为计数值

然后下面这 3 个方法是 CountDownLatch 类中最重要的方法:

public void await() throws InterruptedException { };   // 调用 await() 方法的线程会被挂起,它会等待直到 count 值为 0 才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  // 和 await() 类似,只不过等待一定的时间后 count 值还没变为 0 的话就会继续执行
public void countDown() { };  // 将 count 值减 1
ublic class Test {
   public static void main(String[] args) {   
     final CountDownLatch latch = new CountDownLatch(2);
      
     new Thread(){
       public void run() {
         try {
           System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
          Thread.sleep(3000);
          System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
          latch.countDown();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
       };
     }.start();
      
     new Thread(){
       public void run() {
         try {
           System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
           Thread.sleep(3000);
           System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
           latch.countDown();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
       };
     }.start();
      
     try {
       System.out.println("等待 2 个子线程执行完毕...");
      latch.await();
      System.out.println("2 个子线程已经执行完毕");
      System.out.println("继续执行主线程");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
   }
}
线程 Thread-0 正在执行
线程 Thread-1 正在执行
等待 2 个子线程执行完毕...
线程 Thread-0 执行完毕
线程 Thread-1 执行完毕
2 个子线程已经执行完毕
继续执行主线程

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

浊酒尽余欢

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文