一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
用给定的计数初始化 CountDownLatch
。由于调用了 countDown()
方法,所以在当前计数到达零之前,await
方法会一直受阻塞。之后,会释放所有等待的线程,await
的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
public class Main {
protected static ExecutorService scheduler = Executors.newFixedThreadPool(5);
public static CountDownLatch countDownLatch;//定义一个静态的CountDownLatch
public static void main(String[] args) {
countDownLatch = new CountDownLatch(5); //初始化容量,
int threadNum = taskNum>8?8:taskNum; //创建八个线程,和cpu数目相等
for(int i=0;i<taskNum;i++){
scheduler.execute(new MultiThread()); //启动多个线程
}
try {
countDownLatch.await(); //等待子线程全部执行结束(等待CountDownLatch计数变为0)
logger.info("main thread exit");
System.exit(0);//程序退出
} catch (InterruptedException e) {
System.exit(1);
e.printStackTrace();
}
}
}
public class MultiThread implements Runnable {
public void run() {
logger.info(" starting...");
try {
//do what you wanna do
} catch (Exception e) {
logger.error("", e);
}finally{
logger.info("countDown");
AppDependenciesMain.countDownLatch.countDown();//线程运行结束后,把countDownLatch数目减1
}
}
}
以上内容可保证在所有子进程都执行结束之后,主进程正常退出。