CountDownLatch類的使用,CountDownLatch是一個工具類,運行主線程開啓子線程的時候,子線程還沒有結束的時候,主線程可以一直等待,直到初始化的現成的計數器count爲0,主線程就可以不用等待繼續執行了。
注意:
count只能在實例化CountDownLatch類的時候初始化,沒有其他的辦法count注入值。
countDown方法,當前線程調用此方法,則計數在實例化CountDownLatch中傳入的值基礎上減一。
awaint方法,調用此方法會一直阻塞當前線程,不會向下執行,直到計時器的值爲0的時候程序纔會繼續向下執行。
簡單的使用示例:
import java.util.concurrent.CountDownLatch;
/**
* CountDownLatch的使用
* @author tyl
*
*/
public class Test {
private static final int count = 5;
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i = 0; i < count; ++i) // create and start threads
{
new Thread(new Worker(countDownLatch,i)).start();
}
countDownLatch.await(); //阻塞線程,不繼續往下執行
doLastSomething();
}
private static void doLastSomething() {
System.out.println("等待所有子線程完成之後繼續做我需要做的事情");
}
static class Worker implements Runnable {
private CountDownLatch countDownLatch;
private int i;
public Worker( CountDownLatch doneSignal,int i) {
this.countDownLatch = doneSignal;
this.i=i;
}
public void run() {
try {
doWork();
} catch (Exception e) {
} finally {
countDownLatch.countDown();
}
}
private void doWork() {
System.out.println("創建子線程工作,開始工作.....,子線程ID爲:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}