栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

使用ExecutorService作为局部变量时,一定要在用完后记得shutDown

Java 更新时间:发布时间: 百科书网 趣学号

public String queryAll() throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
ExecutorService cachePool = Executors.newFixedThreadPool(1);
Future future = cachePool.submit(() -> {
return userService.queryAll();
});
while (true) {
if (future.isDone()) {
break;
}
}
List list = future.get();
//cachePool.shutdown();
System.out.println(System.currentTimeMillis() - start);
return “success”;
}

打开注释cachePool.shutdown();

可以看到线程维持稳定。。。

ExecutorService 比较重,牵扯到线程

线程的状态决定了JVM是否会回收了。

假设线程一直在运行,又是用户线程,那么肯定不会被回收。

线程结束了会被回收,是因为线程的状态被改变了。

而我们每次提交Runnable(){},实际是线程池中线程调用了其run()方法,线程本身的状态,并没有变为可回收状态。

所以线程是不会被回收的,当然也就造成了线程泄露了。

coreSize 如果为0 ,keepAliveTime之后是可以被回收的,是可以被回收的。

private shutdownExecutorService(){

//1、停止线程池接收新任务
//2、等待一定时间,让现存的任务执行结束
//3、取消当前运行的任务
//4、如果当前线程也被中断的话,那么就再次关闭线程池,同时恢复中断状态
pool.shutdown();
try{
   if(!pool.awaitTermination(60,TimeUnit.SECONDS)){
        pool.shutdownNow();
        if(!pool.awaitTermination(60,TimeUnit.SECONDS)){
            System.out.println("Pool did not terminate");
        }           
   }
}catch(InterruptedException ie){
     pool.shutdownNow();
     Thread.currentTread().interrupt():
}

}

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/281708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号