一句话解释:主线程阻塞,其他线程完成后,主线程被唤醒后继续执行
1 import java.util.Random;
2 import java.util.concurrent.CountDownLatch;
3
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 public class CountDownLatchLearn {
8
9 private Logger log = LoggerFactory.getLogger(CountDownLatchLearn.class);
10 private CountDownLatch countDownLatch;
11
12 public CountDownLatchLearn() {
13 countDownLatch = new CountDownLatch(50);
14 }
15
16 public void countDown() {
17 Long count = countDownLatch.getCount();
18 log.debug("countDownLatch count is:" + count.toString());
19
20 for (int i = 0; i < count; i++) {
21 Work work = new Work(String.valueOf(i), countDownLatch);
22 work.start();
23 }
24 try {
25 countDownLatch.await();
26 } catch (InterruptedException e) {
27 e.printStackTrace();
28 }
29 log.debug("work finish!!!");
30 }
31
32 private class Work extends Thread {
33
34 private String name;
35 private CountDownLatch countDownLatch;
36
37 public Work(String name, CountDownLatch countDownLatch) {
38 this.name = name;
39 this.countDownLatch = countDownLatch;
40 }
41
42 @Override
43 public void run() {
44 Random r = new Random();
45 int sleep = r.nextInt(2000);
46 try {
47 log.debug("thread sleep: "+ sleep);
48 Thread.sleep(sleep);
49 } catch (InterruptedException e) {
50 e.printStackTrace();
51 }
52 log.debug("thread: " + name + ": do work");
53 countDownLatch.countDown();
54 }
55 }
56
57 public static void main(String[] args) {
58 System.out.println("main start!!!");
59
60 CountDownLatchLearn countDownLatchLearn = new CountDownLatchLearn();
61 countDownLatchLearn.countDown();
62
63 System.out.println("main end!!!");
64 }
65
66 }