CountDownLatch的使用场景

CountDownLatch 是java1.5中引入的一个多线程之间协同的工具类,和它类似的还有CyclicBarrier类,今天我们主要讨论一下CountDownLatch 的两种使用场景。

一、控制线程的启动和结束

当有多个线程协同完成一个任务的时候,我们可以用来控制多个线程的开始和结束。

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
public class Test {
public static void main(String[] ...args) {
// 开始信号
CountDownLatch startSignal = new CountDownLatch(1);
// 结束信号
CountDownLatch doneSignal = new CountDownLatch(10);
// 初始化线程
for(int i = 0; i < 10; i++){
new Thread(new Worker(startSignal, doneSignal)).start();
}
// 这个时候我们做一些其他的事儿,等做完之后,所有的线程同时开始子任务
doSomethingElse();
// countDown 方法执行之后所有的任务同时开始执行
startSignal.countDown();
// 等待所有的任务执行结束
doneSignal.await();
}

public void doSomethingElse() {
System.out.println("任务开始前的工作。。。");
}
}

public class Worker implements Runnable{
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
public Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}

@Override
public void run() {
startSignal.await();
System.out.println(Thread.currentThread().getName() + "开始工作了。。。");
doneSignal.countDown();
}
}

二、等待线程池中的所有线程执行完毕

当我们将一个任务分解成多个子任务来执行时,可以通过CountDownLatch来等待所有的子任务执行完毕。

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
public class Test{

public static void main(String[] ...args) {
CountDownLatch doneSignal = new CountDownLatch(10);
// 初始化线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// 提交任务到线程池
for(int i = 0; i < 10; i++) {
executor.execute(new WorkRunnable(doneSignal, i));
}

// 等待所有的任务执行完毕
doneSignal.await();
}
}

class WorkRunnable implements Runnable{
private final CountDownLatch doneSignal;
private final int i;
public WorkRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}

@Override
public void run() {
doWork(i);
doneSignal.countDown();
}

public void doWork(int i) {
System.out.println(String.format("%s - 正在工作。。。", i));
}
}

 评论



本站由Hexo强力驱动 🔥 使用 Material-x 作为主题

总访问量为 次 。