盒子
盒子

JAVA同步工具类之闭锁

闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。
闭锁相当于一扇门,在闭锁结束之前,这扇门一直关闭,没有任何线程能够通过;当闭锁结束时,这扇门打开,所有的线程均可通过

闭锁状态包括一个计数器,该计数器初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,如果计数器非零,则await方法等待计数器为零,或等待中的线程中断或者等待超时。

闭锁是一次性对象,一旦进入终止状态,就不能被重置。

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
package concurrent.module;

import java.util.concurrent.CountDownLatch;

/**
* 闭锁实现统计多个线程执行时间
*/
public class TestHarness {

public long timeTasks(int nThreads, final Runnable task) throws InterruptedException {
CountDownLatch startGate = new CountDownLatch(1);
CountDownLatch endGate = new CountDownLatch(nThreads);

for (int i = 0 ; i < nThreads; i++) {
new Thread(() -> {
try {
startGate.await();
try {
task.run();
} finally {
endGate.countDown();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}

long startTime = System.nanoTime();
startGate.countDown();
endGate.await();
long endTime = System.nanoTime();
return endTime - startTime;
}

public static void main(String[] args) throws InterruptedException {
Runnable runnable = () -> {
for (int i = 0; i < 10000; i++) {

}
};
long time = new TestHarness().timeTasks(4, runnable);
System.out.println(time);
}
}
支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫