java线程池需要shutdown吗_公用线程池要不要shutdown?
最近学习了线程过后,又想学学线程池,在写测试代码的时候想到一个问题,线程太多可能会导致内存占满的问题,那线程池要不要关闭呢?怎么关闭呢?
已知关闭有两种方法,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?相关推荐
- 线程中这么调用类_这些线程知识总结是真的到位!java开发两年的我看的目瞪口呆
前言 什么是线程:程序中负责执行的那个东东就叫做线程(执行路线,进程内部的执行序列),或着说是进程的子任务. Java中实现多线程有几种方法 继承Thread类: 实现Runnable接口: 实现Ca ...
- 线程执行一半断了_有的线程它死了,于是它变成一道面试题
----本文首发于公众号,关注文末公众号阅读体验更佳 有些线程它活着,但它躺在池中碌碌无为: 有的线程它死了,于是它变成一道面试题. 这次的文章,要从一次阿里的面试说起. 我记得那天是周一,刚刚经历过 ...
- 平流式隔油池计算_广州隔油池清理公司讲述清理隔油池程序和标准_新闻中心...
广州隔油池清理公司讲述清理隔油池程序和标准_隔油池清理,清理隔油池,隔油池清理方案,隔油池清理公司,隔油池清理价格 1.?隔油池/内污水油每月定期清理一次,若检查发现污水油超标以致可能影响隔油池有效性 ...
- Java多线程学习九:如何正确关闭线程池?shutdown 和 shutdownNow 的区别
如何正确关闭线程池?以及 shutdown() 与 shutdownNow() 方法的区别?首先,我们创建一个线程数固定为 10 的线程池,并且往线程池中提交 100 个任务,如代码所示. 复制代码 ...
- java 等待线程池结束_等待线程池中任务执行完毕做优雅关闭
背景 在Java开发中,如果涉及多线程,会经常使用到线程池,本期不额外讲述线程池本身相关的东西.考虑一种场景,如果我们提交给线程池的任务都相对比较耗时,而在任务启动运行后,如果后续有需求的变更,要重新 ...
- java 手编线程池_死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...
我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...
- JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...
- JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业 ...
最新文章
- Javascript 动态修改select方法大全【转】
- redis 学习笔记一
- 【MySQL】数据库事务处理---MySQL
- 怎样将Excel中的数据导入到SQL Server 2000数据库中
- 自定义微信小程序TabBar
- 【2G模组Air202开发】使用LuatTools下载Luat底层Lod及编写第一个程序:流水灯
- matlab:正态分布的概率密度图形
- 恩格玛密码机的工作原理
- word文档图片画红线_Word文档怎么在图片内画线?
- 手机sim卡插到电脑上网_听说有的笔记本电脑可以用手机卡的流量上网,是怎么弄的?需要在电脑上插手机卡么?是不是一般的笔记本都 ......
- win10系统暴雪战网连不上服务器,win10系统暴雪战网无法登陆的解决方法
- 李白打酒*C语言简易版(递归)
- c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
- jquery word export 导出html内容无样式或无图片问题
- 考研数学-基础阶段几何串讲1主讲人:王淳 -2020年06月26日
- overcommit_memory=1是否可以改善服务器内存不足的情况
- 北京联通天邑TEWA-800E光猫改桥接
- 【快乐手撕LeetCode题解系列】——消失的数字
- JavaSE-利用随机数制作的打怪游戏
- 【电子科学系保研】-- 西安交通大学保研之旅
热门文章
- Gson格式转换Integer变为Double类型问题解决
- libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
- ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法
- IDEA设置生成带注释的getter和setter解决方案 (图文教程)
- 出现梯度消失与梯度爆炸的原因以及解决方案
- LINQ聚合算法解释
- 远程登录出现 身份验证错误 要求的函数不受支持
- python3文档字符串_python3基础:字符串、文本文件
- 英魂之刃服务器维护中修改,英魂之刃gg修改教程 | 手游网游页游攻略大全
- 技能类别mysql_MySQL 数据类型