在番石榴链接期货时处理异常

时间:2016-05-17 14:11:18

标签: java concurrency guava future

关于处理以下代码中的异常:

ListenableFuture<BufferedImage> imgFuture = downloadExecutor
                    .submit(new Downloader(url));
            ListenableFuture<BufferedImage> resizeFuture = Futures.transformAsync(
                    imgFuture, new AsyncFunction<BufferedImage, BufferedImage>()
                    {
                        @Override
                        public ListenableFuture<BufferedImage> apply(
                                BufferedImage input) throws Exception
                        {
                            ListenableFuture<BufferedImage> resizedFuture = null;
                            if (input != null)
                            {
                                resizedFuture = actionExecutor
                                        .submit(new ResizeImageAction(input));
                            }
                            return resizedFuture;
                        }
                    });

            ListenableFuture<BufferedImage> grayFuture = Futures
                    .transformAsync(resizeFuture, input -> {
                        return actionExecutor
                                .submit(new ToGrayImageAction(input));
                    });

假设每个与执行程序相关的动作都可以引发异常,该代码将如何表现。

transformAsync()方法是否知道不会引发异常或引发异常的期货?使用CheckedFuture会帮助我吗?如果是这样,我应该如何使用它?

感谢!!!!

1 个答案:

答案 0 :(得分:2)

它知道抛出的异常,但不知道null,因为它是完全合法的值。如果在第一个ListenableFuture中抛出异常,那么它将被传播到所有变换器:它们的onFailure回调将被调用,但不会被调用(因为没有变换值)。 / p>

Javadoc到transformAsync

  

@return保存函数结果的未来(如果输入成功)或原始输入失败(如果没有)

简单示例:

ListenableFuture<Integer> nullFuture = executor.submit(() -> null);
ListenableFuture<Integer> exceptionFuture = executor.submit(() -> {
    throw new RuntimeException();
});

// Replace first argument with exceptionFuture to get another result
ListenableFuture<Integer> transformer = Futures.transformAsync(nullFuture, i -> {
    System.out.println(i);
    return Futures.immediateCheckedFuture(1);
}, executor);

Futures.addCallback(transformer, new FutureCallback<Integer>() {
    @Override
    public void onSuccess(Integer result) {
        System.out.println(result);
  }

    @Override
    public void onFailure(Throwable t) {
        System.out.println(t);
  }
});

对于nullFuture“null,将打印1”,而对于exceptionFuture,仅打印“java.lang.RuntimeException”,因为异常传播到其变换器。