首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java 线程池使用后到底要不要关闭

java 线程池使用后到底要不要关闭

作者头像
用户2038589
发布2019-03-01 10:47:28
13.3K5
发布2019-03-01 10:47:28
举报
文章被收录于专栏:青青天空树青青天空树

本篇原创发布于: java 线程池使用后到底要不要关闭

最近在开发中用到了java的线程池,然后就很疑惑这个线程池到底要不要手动关闭,感觉是要关闭的,但是没人强调线程池用完要关闭。so今天来试验下到底线程池用完要不要关闭。

为避免引起误解被喷,特此说明下:下面的代码是为了验证gc在回收线程池对象时,线程池对象管理的线程是否会销毁掉。如下在循环中创建线程池是为了模拟线程池使用一次后不再使用的情况。 虽然通常线程池都是作为全局变量使用,但是如果作为局部变量使用呢?使用完要不要手动关闭掉?

直接上实验代码

public static void main(String[] args) throws Exception {
        //用于获取到本java进程,进而获取总线程数
    RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
    String jvmName = runtimeBean.getName();
    System.out.println("JVM Name = " + jvmName);
    long pid = Long.valueOf(jvmName.split("@")[0]);
    System.out.println("JVM PID  = " + pid);
    ThreadMXBean bean = ManagementFactory.getThreadMXBean();
    int n = 30000;
    for (int i = 0; i < n; i++) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(10,20,1000,TimeUnit.SECONDS,new LinkedBlockingDeque<>());
        for(int j=0;j<10;j++){
            executor.execute(()->{
                System.out.println("当前线程总数为:"+bean.getThreadCount());
            });
        }
    }
    Thread.sleep(10000);
    System.out.println("线程总数为 = " + bean.getThreadCount());
}

  简单来说就是在一个 for 循环中创建线程池,然后执行一个打印任务(不执行任务线程不会真正创建),打印出当前 java 进程的总线程数,下面是打印部分结果:

线程
线程

可以看到在创建到 15 万个线程是爆内存,内存占用百分百后 java 应用崩溃。说明线程未被回收。

PS:内存占用百分百后,部分应用开始出现异常,界面花屏,闪屏,不能正常绘制gui,不知道为啥,即使后面内存占用降下来也一样,只能重启应用。

结论

  如果局部使用线程池,用完后不再使用它,一定记得手动关闭线程池,否则跑着跑着就内存爆炸崩溃。回收函数如下:

//执行此函数后线程池不再接收新任务,并等待所有任务执行完毕后销毁线程。此函数并不会等待线程销毁完毕,而是立即返回的
executor.shutdown();
//如想要同步等待线程池完成关闭,可使用下面的函数判断是否都执行完毕了,该函数等待timeout后,返回是否所有任务都执行完毕了
pool.awaitTermination(timeout,TimeUnit)

//尝试结束所有活动线程,并返回等待队列里的任务
executor.shutdownNow();

本篇原创发布于: java 线程池使用后到底要不要关闭

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直接上实验代码
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档