最近学习了线程过后,又想学学线程池,在写测试代码的时候想到一个问题,线程太多可能会导致内存占满的问题,那线程池要不要关闭呢?怎么关闭呢?

已知关闭有两种方法,shutdown()和shutdownNow()。shutdown()方法会关闭线程池,不再接受新的任务,已接受的任务会继续执行,直到完成。shutdownNow()方法也类似,不过它会去尝试终止正在执行的任务。如果任务都已提交或者都执行完,当然shutdown就没问题啦。那还有线程没execute线程池就被shutdown呢?

我们先写一个线程池的公用单例。

/*** @ClassName ThreadPoolSingleTest

* @Description 线程池单例模式

* @Auther zhui

* @Date 2020/7/2 8:47

* @Version 1.0

**/

public classThreadPoolSingleTest {private static ThreadPoolExecutor threadPoolExecutor=null;public staticThreadPoolExecutor getThreadPoolExecutor(){if(threadPoolExecutor==null){synchronized (ThreadPoolSingleTest.class){if(threadPoolExecutor==null){

threadPoolExecutor= new ThreadPoolExecutor(10,50,5, TimeUnit.MINUTES,new LinkedBlockingQueue<>());

}

}

}returnthreadPoolExecutor;

}

}

然后测试如果还未execute,线程池就被别的线程shutdown了怎么办?

public classTest {public static voidmain(String[] args) {

ThreadPoolExecutor threadPoolExecutor=ThreadPoolSingleTest.getThreadPoolExecutor();//这个线程执行完成后就shutdown线程

threadPoolExecutor.execute(()->{try{

Thread.sleep(2000);

}catch(Exception e){}

});//模拟其他线程拿到了线程池实例,但是还未提交任务

new Thread(()->{

ThreadPoolExecutor threadPoolExecutor1=ThreadPoolSingleTest.getThreadPoolExecutor();

out.println("new Thread已经拿到了ThreadPoolExecutor");try{//等它睡醒,懵逼的发现线程池被shutdown了

Thread.sleep(5000);

}catch(Exception e){}

threadPoolExecutor1.execute(()->{

out.println("执行");

});

}).start();

threadPoolExecutor.shutdown();

}

}

运行结果还是报错了,线程池被关掉了,无法提交任务。

Exception in thread "Thread-0" java.util.concurrent.RejectedExecutionException: Task 测试.Test$$Lambda$3/1588496549@50697d00 rejected from java.util.concurrent.ThreadPoolExecutor@5456e3d5[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1]

at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)

at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)

at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)

at 测试.Test.lambda$main$2(Test.java:310)

at java.lang.Thread.run(Thread.java:748)

做到这里,就知道了,公用线程池是不能被shutdown的,毕竟在业务上,一个地方手贱的shutdown了,其他持有线程池对象却没来得及提交任务的代码就GameOver了。但是但是就真的有人手贱要shutdown怎么办?哎,那没办法,单例模式再多加一个判断吧。

public classThreadPoolSingleTest {private static ThreadPoolExecutor threadPoolExecutor=null;public staticThreadPoolExecutor getThreadPoolExecutor(){//为null和被shutdown都实例化对象

if(threadPoolExecutor==null||threadPoolExecutor.isShutdown()){synchronized (ThreadPoolSingleTest.class){if(threadPoolExecutor==null||threadPoolExecutor.isShutdown()){

threadPoolExecutor= new ThreadPoolExecutor(10,50,5, TimeUnit.MINUTES,new LinkedBlockingQueue<>());

}

}

}returnthreadPoolExecutor;

}

}

以上方法只是防止被shutdown后执行任务失败,但是还是会有错误的风险,所以最好还是不要随便的shutdown线程池了。

java线程池需要shutdown吗_公用线程池要不要shutdown?相关推荐

  1. 线程中这么调用类_这些线程知识总结是真的到位!java开发两年的我看的目瞪口呆

    前言 什么是线程:程序中负责执行的那个东东就叫做线程(执行路线,进程内部的执行序列),或着说是进程的子任务. Java中实现多线程有几种方法 继承Thread类: 实现Runnable接口: 实现Ca ...

  2. 线程执行一半断了_有的线程它死了,于是它变成一道面试题

    ----本文首发于公众号,关注文末公众号阅读体验更佳 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里的面试说起. 我记得那天是周一,刚刚经历过 ...

  3. 平流式隔油池计算_广州隔油池清理公司讲述清理隔油池程序和标准_新闻中心...

    广州隔油池清理公司讲述清理隔油池程序和标准_隔油池清理,清理隔油池,隔油池清理方案,隔油池清理公司,隔油池清理价格 1.?隔油池/内污水油每月定期清理一次,若检查发现污水油超标以致可能影响隔油池有效性 ...

  4. Java多线程学习九:如何正确关闭线程池?shutdown 和 shutdownNow 的区别

    如何正确关闭线程池?以及 shutdown() 与 shutdownNow() 方法的区别?首先,我们创建一个线程数固定为 10 的线程池,并且往线程池中提交 100 个任务,如代码所示. 复制代码 ...

  5. java 等待线程池结束_等待线程池中任务执行完毕做优雅关闭

    背景 在Java开发中,如果涉及多线程,会经常使用到线程池,本期不额外讲述线程池本身相关的东西.考虑一种场景,如果我们提交给线程池的任务都相对比较耗时,而在任务启动运行后,如果后续有需求的变更,要重新 ...

  6. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  7. 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

    我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...

  8. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...

  9. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业 ...

最新文章

  1. Javascript 动态修改select方法大全【转】
  2. redis 学习笔记一
  3. 【MySQL】数据库事务处理---MySQL
  4. 怎样将Excel中的数据导入到SQL Server 2000数据库中
  5. 自定义微信小程序TabBar
  6. 【2G模组Air202开发】使用LuatTools下载Luat底层Lod及编写第一个程序:流水灯
  7. matlab:正态分布的概率密度图形
  8. 恩格玛密码机的工作原理
  9. word文档图片画红线_Word文档怎么在图片内画线?
  10. 手机sim卡插到电脑上网_听说有的笔记本电脑可以用手机卡的流量上网,是怎么弄的?需要在电脑上插手机卡么?是不是一般的笔记本都 ......
  11. win10系统暴雪战网连不上服务器,win10系统暴雪战网无法登陆的解决方法
  12. 李白打酒*C语言简易版(递归)
  13. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
  14. jquery word export 导出html内容无样式或无图片问题
  15. 考研数学-基础阶段几何串讲1主讲人:王淳 -2020年06月26日
  16. overcommit_memory=1是否可以改善服务器内存不足的情况
  17. 北京联通天邑TEWA-800E光猫改桥接
  18. 【快乐手撕LeetCode题解系列】——消失的数字
  19. JavaSE-利用随机数制作的打怪游戏
  20. 【电子科学系保研】-- 西安交通大学保研之旅

热门文章

  1. Gson格式转换Integer变为Double类型问题解决
  2. libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
  3. ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法
  4. IDEA设置生成带注释的getter和setter解决方案 (图文教程)
  5. 出现梯度消失与梯度爆炸的原因以及解决方案
  6. LINQ聚合算法解释
  7. 远程登录出现 身份验证错误 要求的函数不受支持
  8. python3文档字符串_python3基础:字符串、文本文件
  9. 英魂之刃服务器维护中修改,英魂之刃gg修改教程 | 手游网游页游攻略大全
  10. 技能类别mysql_MySQL 数据类型