我正在尝试用Java语言编写异步编程,并且我正在使用ExecutorService创建一个由多个线程支持的池,以提交多个可调用的任务,但是我对如何关闭ExecutorService几乎没有什么疑问。
以下是我的原始代码:
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()
中的代码将永远占用时间,程序将永远停止,永远不会退出。
带着担心,这是我的第二次尝试:
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
来阻塞程序。
发布于 2018-08-13 17:43:54
在你的第二个版本中,你的程序不应该被阻塞10秒。只有当你的线程没有在10秒内终止时,它才应该等待10秒。如果您的线程在10秒内没有完成,您的executor服务将暂停所有线程的终止。来自Java文档
/** *会一直阻塞,直到所有任务在一个shutdown *请求后完成执行,或者发生超时,或者当前线程被*中断,以先发生的为准。** @param timeout等待的最长时间* @param unit超时参数的时间单位*@如果此执行程序终止,则返回{@code true},如果在终止前超时,则返回* {@code false} *@如果等待时中断,则抛出InterruptedException */
https://stackoverflow.com/questions/51819342
复制相似问题