天道不一定酬所有勤
但是,天道只酬勤

多线程中CountDownLatch的用法

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

用给定的计数初始化 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
        }
    }
}

以上内容可保证在所有子进程都执行结束之后,主进程正常退出。

(全文完)
欢迎关注HollisChuang微信公众账号
打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » 多线程中CountDownLatch的用法

分享到:更多 ()

HollisChuang's Blog

联系我关于我