概述
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。
用法
new CountDownLatch(n)初始化一个计数为n的
CountDownLatch;
countdownlatch.countDown()每当一个任务线程执行完毕,就将计数器减1;
coundownlatch.await()当计数器的值变为0时,就会被唤醒。
实例
package com.business.thread;
import java.util.concurrent.CountDownLatch;
/* 使用CountDownLatch
* 2个初始化线程、1个业务线程、4个初始化线程,1个主线程。需要等待初始化线程等操作完,主线程和业务线程再工作
*/
public class UseCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
//初始化线程
private static class initThread implements Runnable{
@Override
public void run() {
System.out.println("Thread "+Thread.currentThread().getName()+
"init");
latch.countDown();
System.out.println("Thread "+Thread.currentThread().getName()+
"do other");
}
}
//业务线程
private static class busiThread implements Runnable{
@Override
public void run() {
try {
latch.await();//等待其他线程完成工作
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread "+Thread.currentThread().getName()+
"do bussiness");
}
}
public static void main(String[] args) throws InterruptedException {
//初始化线程完成两个初始化操作
new Thread(new Runnable(){
public void run() {
System.out.println("Thread "+Thread.currentThread().getName()+
"init work step1");
latch.countDown();
System.out.println("Thread "+Thread.currentThread().getName()+
"init work step2");
latch.countDown();
}
}).start();
//创建业务线程
new Thread(new busiThread()).start();
//创建4个初始化线程
for(int i=0;i<=3;i++) {
Thread thread = new Thread(new initThread());
thread.start();
}
latch.await();//等待初始化完成
System.out.println("main do its work");
}
}
执行结果
Thread Thread-0init work step1
Thread Thread-0init work step2
Thread Thread-2init
Thread Thread-2do other
Thread Thread-3init
Thread Thread-4init
Thread Thread-4do other
Thread Thread-5init
Thread Thread-5do other
Thread Thread-3do other
main do its work
Thread Thread-1do bussiness