我的代码如下:
public Future<String> getFuture() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(() -> {
//do something
return "test string";
});
executorService.shutDown(); // is this correct?
return future;
}
我从其他班级调用此服务以获得未来:
Future<String> future = getFuture();
String result = future.get();
future.cancel(true); // will this assure that there wont be any thread leak?
现在出了executorService.shutDown()
和future.cancel(true)
这将确保不会出现线程泄漏?
请注意,当我在future.cancel(true)
的结果中检查当前正在运行的线程时调用Thread.getAllStackTraces()
之后,我仍然可以找到未来执行的线程。
答案 0 :(得分:3)
你问的是错误的问题!
在方法中创建服务没有意义,然后将其扔掉。
创建该服务实例并非免费提供。这种抽象的整个想法是确保高效使用基础架构元素!
换句话说:退后一步,重新设计你的设计;以便此服务成为某类课程的字段!是的,这可能会变得复杂。但最有可能的是,与继续你问题中所示的方法相比,在那个角落花费时间将会花更多的时间 - 而不是这个方法。
答案 1 :(得分:0)
现在没有执行器服务.shutDown()和future.cancel(true),这将确保不会出现线程泄漏?
他们都没有 executorService.shutdown()将继续运行当前任务并拒绝新提交的任务。
如果当前正在运行,则future.cancel(true)将中断相应的任务(但是您负责检查任务是否被中断并尽快完成任务的执行)请注意,当我在Thread.getAllStackTraces()的结果中检查当前正在运行的线程时调用future.cancel(true)后,我仍然可以找到未来执行的线程。
如前所述,future.cancel(true)不会停止该线程。它只会发送中断。