作用
是一组线程等待其他的线程完成工作以后在执行,加强版join;
await()用来等待,countDown()负责计数器的减一;
一个线程需要等待其余线程扣减完一定的数目在执行,就需要在这个线程中执行CountDownLatch对象的await()方法,进入等待队列
案例
public class UseCountDownLatch {
//创建CountDownLatch对象,并表示需要扣减6次
static CountDownLatch latch = new CountDownLatch(6);
//初始化线程(只有一步,有4个)
private static class InitThread implements Runnable{
@Override
public void run() {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work......");
latch.countDown();//初始化线程完成工作了,countDown方法只扣减一次;
for(int i =0;i<2;i++) {
System.out.println("Thread_"+Thread.currentThread().getId()
+" ........continue do its work");
}
}
}
//业务线程
private static class BusiThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getId()+"线程执行");
try {
latch.await();//当扣减达到指定次数,就会唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i =0;i<3;i++) {
System.out.println("BusiThread_"+Thread.currentThread().getId()
+" do business-----");
}
}
}
public static void main(String[] args) throws InterruptedException {
//单独的初始化线程,初始化分为2步,需要扣减两次
new Thread(new Runnable() {
@Override
public void run() {
SleepTools.ms(1);//休眠时间
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 1st......");
latch.countDown();//每完成一步初始化工作,扣减一次
System.out.println("begin step 2nd.......");
SleepTools.ms(1);
System.out.println("Thread_"+Thread.currentThread().getId()
+" ready init work step 2nd......");
latch.countDown();//每完成一步初始化工作,扣减一次
}
}).start();
new Thread(new BusiThread()).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
//main线程等待
latch.await();
System.out.println("Main do ites work........");
}
}