即當前線程,等待CountDownLatch中的各子線程任務都完成後,在繼續往下執行的任務
下述demo新建一個倒數計數器10。
每個線程計數器調用countDownLatch.countDown();倒計數一次。
主方法裏,使用線程池分發了十個線程做子任務,並調用countDownLatch.await();方法等待倒計數完成。
等十個子線程都完成後,倒計數爲0,則主線程await()方法後的代碼才執行。
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author:minglu
* @Description:
* @Date: 2018/11/27
*/
public class CountDownLatchDemo implements Runnable {
static final CountDownLatch countDownLatch = new CountDownLatch(10);
static final CountDownLatchDemo demo = new CountDownLatchDemo();
@Override
public void run() {
try{
//模擬檢查任務
Thread.sleep(new Random().nextInt(10)*1000);
countDownLatch.countDown();
System.out.println("sub Check complete! rest sub check number:"+countDownLatch.getCount());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.submit(demo);
}
//等待十個檢查任務完成
countDownLatch.await();
//
System.out.println("all check complete ! fire !");
service.shutdown();
}
}
運行結果
sub Check complete! rest sub check number:9
sub Check complete! rest sub check number:8
sub Check complete! rest sub check number:7
sub Check complete! rest sub check number:6
sub Check complete! rest sub check number:5
sub Check complete! rest sub check number:4
sub Check complete! rest sub check number:3
sub Check complete! rest sub check number:2
sub Check complete! rest sub check number:1
sub Check complete! rest sub check number:0
all check complete ! fire !