CountDownLatch 介绍
CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器。如果调用对象上的await()方法,调用者就会一直阻塞,直到别人调用countDown方法,将计数减到0,才可以继续执行。
CountDownLatch可以避免等待队列,它可以让代码执行效率更高一些。
代码实例:
final CountDownLatch latch = new CountDownLatch(1); //定义一个门闩(计数器),一旦定义,不可变。
门闩常用方法:
latch.await(); 等待门闩的开放,不是进入等待队列。
latch.countDown(); 调用此方法,门闩减一
以一个案例讲解CountDownLatch门闩
要求:定义一个容器,该容器最大限度为10,当容器元素添加到第5个的时候,打印容器大小。
代码:
复制代码
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62/** * CountDownLatch 门闩 */ package concurrent.t02; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Test_03 { public static void main(String[] args) { final Test_03_Container t = new Test_03_Container(); final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable(){ @Override public void run() { if(t.size() != 5){ try { latch.await(); // 等待门闩的开放。 不是进入等待队列 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("size = 5"); } }).start(); new Thread(new Runnable() { @Override public void run() { for(int i = 0; i < 10; i++){ System.out.println("add Object to Container " + i); t.add(new Object()); if(t.size() == 5){ latch.countDown(); // 门闩-1 } try { TimeUnit.SECONDS.sleep(1); } catch (Exception e) { e.printStackTrace(); } } } }).start(); } } class Test_03_Container{ List<Object> container = new ArrayList<>(); public void add(Object o){ this.container.add(o); } public int size(){ return this.container.size(); } }
门闩应用场景:马拉松比赛
最后
以上就是传统大碗最近收集整理的关于CountDownLatch 门闩 实例详解的全部内容,更多相关CountDownLatch内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复