關於Java-CountDownLatch

關於Java-CountDownLatch

CountDownLatch 可以看作一個計數器,不過計數是原子操作,
也就是說同一時間只有一個執行緒能夠操作該計數器。

常用方法介紹

1
2
3
4
5
6
7
8
9
Public constructors
CountDownLatch(int count)
-------------------
Public methods
void await()
boolean await(long timeout, TimeUnit unit)
void countDown()
long getCount()
String toString()

example

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
private static ExecutorService exec;

public static void setUpBeforeClass() {
exec = Executors.newFixedThreadPool(1000);
}

final CountDownLatch latch = new CountDownLatch(13 * 13 * 14 * 13 * 13 * 14);

for (int i = 0; i <= 12; i++) {
for (int j = 0; j <= 12; j++) {
for (int k = 0; k <= 13; k++) {
for (int l = 0; l <= 12; l++) {
for (int m = 0; m <= 12; m++) {
for (int n = 0; n <= 13; n++) {
Runnable task = new Runnable() {

@Override
public void run() {
try {
//To do something
} catch (Exception e) {
LogUtils.error.error("Failure!!! type:" + type, e);
} finally {
latch.countDown();
}
}
};
exec.execute(task);
}
}
}
}
}
}
latch.await();
System.out.println("All tasks are already finish!!");
此例子會使用1000個執行緒跑13 * 13 * 14 * 13 * 13 * 14個task
因為有使用CountDownLatch 每執行一個task會使用latch.countDown();去減1
最後latch.await(); 變成0時就代表所有執行緒皆已完成。