最近在很多地方看到使用CountDownLatch,但是我还不知道这个东东是干啥的,通过查看api文档,了解这个类的使用,这里就记录学习下。
A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
这个是API里面解释
CountDownLatch主要是控制多线程里面某一个线程需要等待其他线程都运行完了才执行的。
这上面说了它主要是控制多个线程里面的其他线程都运行完毕之后才能运行,那么肯定就有一个可以设置在最后一个线程要运行之前的所有进程啦。。
public CountDownLatch(int count)
CountDownLatch这个类中已经提供构造方法给我们设置了
接下来还有两个方法看一下,就可以写个小例子来看看CountDownLatch是怎么用的啦。。
public void countDown(),此方法是当一个线程运行完之后,调用他,对应的count值会-1。
public void await(),这个方法是用在最后一个线程要运行之前,只有当count值为0时,最后一个线程就会运行。
下面来看下一个小例子
package test;
import java.util.concurrent.CountDownLatch;
public class ThreadTest {
CountDownLatch countDownLatch = new CountDownLatch(2);
class WorkerTheard1 extends Thread{
@Override
public void run() {
super.run();
System.out.print("线程1开始工作啦\n");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("线程1结束工作啦\n");
countDownLatch.countDown();
}
}
class WorkerThread2 extends Thread{
@Override
public void run() {
super.run();
try {
System.out.println("线程2开始工作啦\n");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2结束工作啦\n");
countDownLatch.countDown();
}
}
class WorkerThread3 extends Thread{
@Override
public void run() {
super.run();
try {
countDownLatch.await();
System.out.println("线程3开始工作啦\n");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程3结束工作啦\n");
}
}
public static void main(String[] args) throws Exception {
ThreadTest threadTest = new ThreadTest();
threadTest.new WorkerTheard1().start();
threadTest.new WorkerThread2().start();
threadTest.new WorkerThread3().start();
}
}
运行之后的结果
线程1开始工作啦
线程2开始工作啦
线程2结束工作啦
线程1结束工作啦
线程3开始工作啦
线程3结束工作啦
这里可以看到线程3是等到线程1,和线程2都执行完毕,才执行的。