爪哇2博客
爪哇2博客

爪哇中的CountDownLatch

爪哇中的CountDownLatch
As per 爪哇 docs, CountDownLatch is synchronisation aid that allow one or more 线s to wait until set of operations being performed in other 线s completes.
换句话说,CountDownLatch等待其他线程完成操作集。
CountDownLatch用count初始化。任何线程通常主线程都调用latch.awaits()方法,因此它将等待计数变为零或它’s interrupted by another 线 and all other 线 need to call 闩锁.countDown() once they complete some operation.

So count is reduced by 1 whenever 闩锁.countDown() method get called, so  if count is n 这意味着计数可以用作 n 线程必须完成某些操作或必须完成某些操作 n 次。

CountDownLatch的缺点之一是一旦计数为零就无法重用它。为此,您需要使用CyclicBarrier。

例如:

下图将使您清楚。它是一个 如何使用CountDownLatch。

让’例如,您正在开发应用程序,因此’主线程必须等待其他服务(线程)(例如UI初始化,数据库初始化和日志记录服务)完成。因此,将使用3初始化Countdownlatch,主线程将调用await()方法,并且一旦服务即将完成,每个服务将调用lock.countDown()。
爪哇中的CountDownLatch

程序:

创建一个名为UIInitialization.java的类。完成后,该线程将执行latch.countDown()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
组织.Arpit.爪哇2blog.线;
 
进口 爪哇.实用程序.同时.CountDownLatch;
 
上市 用户界面 初始化 实施 可运行{
 
CountDownLatch 闩锁;
用户界面 初始化(CountDownLatch 闩锁)
{
  这个.闩锁=闩锁;
}
@覆写
上市 虚空 () {
  系统..打印(“初始化UI”);
  尝试 {
   线.睡觉(3000);
  } 抓住 (InterruptedException e) {
   // TODO自动生成的catch块
   e.printStackTrace();
  }
  系统..打印(“完成UI初始化”);
  闩锁.倒数();
}
 
}
 

创建一个名为记录初始化.java的类。完成后,该线程将执行latch.countDown()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
组织.Arpit.爪哇2blog.线;
 
进口 爪哇.实用程序.同时.CountDownLatch;
 
上市 记录初始化 实施 可运行{
 
CountDownLatch 闩锁;
记录初始化(CountDownLatch 闩锁)
{
  这个.闩锁=闩锁;
}
@覆写
上市 虚空 () {
  系统..打印(“初始化日志记录”);
  尝试 {
   线.睡觉(2000);
  } 抓住 (InterruptedException e) {
   // TODO自动生成的catch块
   e.printStackTrace();
  }
  系统..打印(“完成日志记录初始化”);
  闩锁.倒数();
}
 
}
 

创建一个名为数据库初始化.java的类。完成后,该线程将执行latch.countDown()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
组织.Arpit.爪哇2blog.线;
 
进口 爪哇.实用程序.同时.CountDownLatch;
 
上市 数据库初始化 实施 可运行{
 
CountDownLatch 闩锁;
数据库初始化(CountDownLatch 闩锁)
{
  这个.闩锁=闩锁;
}
@覆写
上市 虚空 () {
  系统..打印(“初始化数据库”);
  尝试 {
   线.睡觉(5000);
  } 抓住 (InterruptedException e) {
   // TODO自动生成的catch块
   e.printStackTrace();
  }
  系统..打印(“完成数据库初始化”);
  闩锁.倒数();
}
 
}
 

创建一个CountDownLatchMain.java类。这将是主线程,它将等待UIInitialization,数据库初始化和记录初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
组织.Arpit.爪哇2blog.线;
 
进口 爪哇.实用程序.同时.CountDownLatch;
 
上市 CountDownLatchMain {
 
上市 静态的 虚空 主要([] args) {
  尝试 {
   CountDownLatch 闩锁 = CountDownLatch(3);
 
   //初始化三个相关线程,即UI,数据库和日志记录
 
   用户界面 初始化 ui初始化 = 用户界面 初始化(闩锁);
   线 uiThread = 线(ui初始化);
 
   数据库初始化 数据库初始化 = 数据库初始化(闩锁);
   线 数据库Thread = 线(数据库初始化);
 
   记录初始化 loggingInitialization = 记录初始化(闩锁);
   线 loggingThread = 线(loggingInitialization);
 
   uiThread.开始();
   数据库Thread.开始();
   loggingThread.开始();
   //主线程将等待直到以上线程完成
   闩锁.等待();
 
   系统..打印(“初始化已完成,主线程可以立即进行”);
  } 抓住 (InterruptedException e) {
 
   e.printStackTrace();
  }
 
}
}
 

当您运行上述程序时,将得到以下输出:

1
2
3
4
5
6
7
8
9
 
初始化中 用户界面
初始化中 数据库
初始化中 记录中
完成了 记录中 初始化
完成了 用户界面 初始化
完成了 数据库 初始化
初始化 拥有 已完成, 主要 线 能够 继续 现在
 

为什么不使用join而不是CountDownLatch:

如您所知,您也可以在这种情况下使用连接,但是您必须手动处理它。大多数人现在使用ExecutorService处理线程,而CountDownLatch可以很好地使用它。由于CountDownLatch是面向任务的,因此您可以将多个任务提交到线程池,并且一旦其他依赖线程集完成,CountDownLatch将确保执行原始线程。

请通过  前50个Java核心面试问题 了解更多面试问题。


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


让’s be Friends

©2020 爪哇2博客