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

public String queryAll() throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
ExecutorService cachePool = Executors.newFixedThreadPool(1);
Future<List> 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”;
}
使用ExecutorService作为局部变量时,一定要在用完后记得shutDown
打开注释cachePool.shutdown();
使用ExecutorService作为局部变量时,一定要在用完后记得shutDown
可以看到线程维持稳定。。。

ExecutorService 比较重,牵扯到线程

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

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

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

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

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

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

上一篇:java中Executor、ExecutorService、ThreadPoolExecutor区别


下一篇:Java多线程(七)-线程池