首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中关闭ExecutorService的最佳方法

在Java中关闭ExecutorService的最佳方法
EN

Stack Overflow用户
提问于 2018-08-13 17:36:48
回答 1查看 3.5K关注 0票数 5

我正在尝试用Java语言编写异步编程,并且我正在使用ExecutorService创建一个由多个线程支持的池,以提交多个可调用的任务,但是我对如何关闭ExecutorService几乎没有什么疑问。

以下是我的原始代码:

代码语言:javascript
复制
ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

String result = f.get();
System.out.println(result);

这可以很好地工作,并且在线程完成后executor会关闭。但我担心的是,如果写错了什么,可调用任务f.get()中的代码将永远占用时间,程序将永远停止,永远不会退出。

带着担心,这是我的第二次尝试:

代码语言:javascript
复制
ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

if(!executorService.awaitTermination(10, TimeUnit.SECONDS)){
    executorService.shutdownNow();
}

String result = f.get();
System.out.println(result);

使用上面的代码,我可以确保线程在10秒后关闭。但实际上程序被阻塞了10秒,线程可能只需要5秒就可以完成。

我的问题是如何设置强制关闭池中线程的时间,这样我就不需要显式地使用awaitTermination来阻塞程序。

EN

回答 1

Stack Overflow用户

发布于 2018-08-13 17:43:54

在你的第二个版本中,你的程序不应该被阻塞10秒。只有当你的线程没有在10秒内终止时,它才应该等待10秒。如果您的线程在10秒内没有完成,您的executor服务将暂停所有线程的终止。来自Java文档

/** *会一直阻塞,直到所有任务在一个shutdown *请求后完成执行,或者发生超时,或者当前线程被*中断,以先发生的为准。** @param timeout等待的最长时间* @param unit超时参数的时间单位*@如果此执行程序终止,则返回{@code true},如果在终止前超时,则返回* {@code false} *@如果等待时中断,则抛出InterruptedException */

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51819342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档