概述
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