将任务提交给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/

10-11 17:13