在向ListenableFuture
提交任务时使用ExecutorService
处理结果是否有任何优势,而不是通过简单地调用处理结果的函数来执行普通的旧java方式?
未来:
Future<ScanResult> result = threadPoolExecutor.submit(
new Callable<ScanResult>() {
//long running process to get scanResult
return scanResult;
});
ScanResult sr = result.get();
或使用guava ListenableFuture
阻止手动get()
来电。
普通Java方式:
threadPoolExecutor.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
//long running process to get scanResult
jobCompleted(scanResult);
return null;
}
});
答案 0 :(得分:1)
我还没有参与过Guava Concurrency或ListenableFuture
,但我认为主要的优势是通用的基于事件的程序设计,这比基于事件手动触发代码更容易理解和可视化。
Future.get()
是一种阻塞方法,因此无论如何阻止Callable
完成,因此您将两个独立的代码执行路径耦合到一个执行路径中。添加侦听器将它们分离并根据事件逻辑地耦合它们。
另外,根据github link,我们强烈建议您使用它,我猜其原因可能是ListenableFuture
支持的其他服务可能不会出现在普通Future
中。
希望它有所帮助!!