问答

方法中创建的线程池后,执行shutdown后任务还未放入到线程池中,

作者:admin 2021-08-21 我要评论

比方说下面这个demo 这个方法在创建线程池threadPoolExecutor后,通过for循环向线程池加入任务的过程中,shutdown()方法是不是会先执行,导致任务无法全部加入到...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

比方说下面这个demo

这个方法在创建线程池threadPoolExecutor后,通过for循环向线程池加入任务的过程中,shutdown()方法是不是会先执行,导致任务无法全部加入到线程池中就把线程池关闭了

public String demo(List<File> file,String path) {
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
    for (int x = 0; x < file.size(); x++) {
        final int temp = x;
        threadPoolExecutor.execute(() -> {
            logger.info("threadName:" + Thread.currentThread().getName());
            //添加任务temp
        });
    }
    threadPoolExecutor.shutdown();
    logger.info("执行shutdown():线程池关闭");
    while (true) {
        if (threadPoolExecutor.isTerminated()) {
            logger.info("线程池所有的子线程全部执行完毕!");
            return path;
        }
    }

}
###
    for (int x = 0; x < file.size(); x++) {
        final int temp = x;
        threadPoolExecutor.execute(() -> {
            logger.info("threadName:" + Thread.currentThread().getName());
            //添加任务temp
        });
    }
    
    threadPoolExecutor.shutdown();

这两部分是同步的啊,怎么会出现你说的那种情况?
当然如果在 shutdown() 之后执行添加任务,会失败的。

###

shutdown() 是运行完关闭的意思。加入到线程池,和关闭线程池都是在主线程中执行的,是单线程操作,你说的那种情况不会发生。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 使用箭头函数return数据不能实现

    使用箭头函数return数据不能实现

  • 个人小程序号能接入小程序3D地图吗?

    个人小程序号能接入小程序3D地图吗?

  • vue 移动端项目中,使用了better-scrol

    vue 移动端项目中,使用了better-scrol

  • css如何做出区域平均划分为四列

    css如何做出区域平均划分为四列

腾讯云代理商
海外云服务器