ListenableFuture或调用函数来处理任务结果?

时间:2016-10-16 16:55:56

标签: java multithreading concurrency executorservice

在向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;
    }
});

1 个答案:

答案 0 :(得分:1)

我还没有参与过Guava Concurrency或ListenableFuture,但我认为主要的优势是通用的基于事件的程序设计,这比基于事件手动触发代码更容易理解和可视化。

Future.get()是一种阻塞方法,因此无论如何阻止Callable完成,因此您将两个独立的代码执行路径耦合到一个执行路径中。添加侦听器将它们分离并根据事件逻辑地耦合它们。

另外,根据github link,我们强烈建议您使用它,我猜其原因可能是ListenableFuture支持的其他服务可能不会出现在普通Future中。

希望它有所帮助!!