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

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

直接上实验代码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();

//立即结束所有线程,不管是否正在运行,返回未执行完毕的任务列表

executor.shutdownNow();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值