将任务提交给ListenableFuture
时,使用ExecutorService
处理结果是否有任何优势,而不是通过简单地调用处理结果的函数以普通的Java方式进行处理?
未来:
Future<ScanResult> result = threadPoolExecutor.submit(
new Callable<ScanResult>() {
//long running process to get scanResult
return scanResult;
});
ScanResult sr = result.get();
或使用番石榴
ListenableFuture
阻止手动get()
调用。纯Java方式:
threadPoolExecutor.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
//long running process to get scanResult
jobCompleted(scanResult);
return null;
}
});
最佳答案
我没有从事Guava Concurrency或ListenableFuture
的研究,但我认为主要优点是基于通用事件的程序设计,与基于事件手动触发代码相比,它更易于理解和可视化。Future.get()
是一种阻塞方法,因此无论如何,您都将被阻塞,直到Callable
完成为止,这样才能将两个独立的代码执行路径耦合到一个执行路径中。添加侦听器可以使它们解耦,并根据事件在逻辑上进行耦合。
同样根据github link,强烈建议使用它,我想它的原因可能是ListenableFuture
支持的其他服务,这些服务可能不存在于普通Future
中。
希望能帮助到你 !!
关于java - ListenableFuture或call函数来处理任务结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40072885/