packagecom.ricoh.rapp.deploymenttool.ui.component;importjava.util.Date;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classCountdownLatchTest1 {public static voidmain(String[] args) {try{
System.out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成...");
ExecutorService service= Executors.newFixedThreadPool(3);final CountDownLatch latch = new CountDownLatch(3);for (int i = 0; i < 8; i++) {
Runnable runnable= newRunnable() {
@Overridepublic voidrun() {try{
System.out.println("子线程" + Thread.currentThread().getName() + "开始执行" + newDate().getTime());
Thread.sleep(50000);
System.out.println("子线程" + Thread.currentThread().getName() + "执行完成" + newDate().getTime());
latch.countDown();//当前线程调用此方法,则计数减一
} catch(InterruptedException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}/*阻塞第一批次的任务,直到第一批次的每个线程都执行完毕才会执行下面的代码;
* 第一批次如果有执行玩的会开始第二批次的任务,所以会存在第一二批次任务混合的情况
**/latch.await();//阻塞当前线程,直到计时器的值为0
System.out.println("主线程" + Thread.currentThread().getName() + "开始执行...");
}catch(Exception e) {
e.printStackTrace();
}
}/** console:
* 主线程main等待子线程执行完成...
子线程pool-1-thread-2开始执行1558941022561
子线程pool-1-thread-1开始执行1558941022561
子线程pool-1-thread-3开始执行1558941022561
子线程pool-1-thread-3执行完成1558941072565
子线程pool-1-thread-2执行完成1558941072565
子线程pool-1-thread-3开始执行1558941072565
子线程pool-1-thread-1执行完成1558941072565
子线程pool-1-thread-2开始执行1558941072565
主线程main开始执行...
子线程pool-1-thread-1开始执行1558941072565
子线程pool-1-thread-3执行完成1558941122572
子线程pool-1-thread-1执行完成1558941122572
子线程pool-1-thread-1开始执行1558941122572
子线程pool-1-thread-2执行完成1558941122572
子线程pool-1-thread-3开始执行1558941122572
子线程pool-1-thread-3执行完成1558941172580
子线程pool-1-thread-1执行完成1558941172580*/}