我正在尝试用 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);
这很好用,执行程序在线程完成后关闭。但是我担心如果写错了可调用任务中的代码 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来阻止程序。
江户川乱折腾
侃侃尔雅
呼啦一阵风
相关分类