Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ListenableFuture链能否处理内部ExecutionException?_Java_Asynchronous_Java 8_Guava_Future - Fatal编程技术网

Java ListenableFuture链能否处理内部ExecutionException?

Java ListenableFuture链能否处理内部ExecutionException?,java,asynchronous,java-8,guava,future,Java,Asynchronous,Java 8,Guava,Future,我得到了一个api(fnGrpc),它执行gRPC调用并返回一个ListenableFuture,该值解析为某个值v(其实现是固定的,不可修改的) 我想提供一个助手函数(fnheloper),它可以: 对gRPC结果进行一些转换处理,其本身返回一个解析为转换值的ListenableFuture 处理gRPC调用失败,并返回一些其他值t2,而不是让fnheloper的调用者看到执行异常 我可以使用Futures.transform()来解决(1): 我如何在FNHeloper返回一个Listena

我得到了一个api(fnGrpc),它执行gRPC调用并返回一个
ListenableFuture
,该值解析为某个值v(其实现是固定的,不可修改的)

我想提供一个助手函数(fnheloper),它可以:

  • 对gRPC结果进行一些转换处理,其本身返回一个解析为转换值的
    ListenableFuture

  • 处理gRPC调用失败,并返回一些其他值t2,而不是让fnheloper的调用者看到
    执行异常

  • 我可以使用
    Futures.transform()
    来解决(1):

    我如何在FNHeloper返回一个
    ListenableFuture
    并保持非阻塞的情况下实现(2)?


    我可以让fnheloper自己创建一个额外的线程,在这个线程中我可以调用
    .get()
    ,在fnGrpc上,但是有没有其他方法可以避免这个额外的线程呢?

    我不是番石榴专家,但似乎你可以使用相同的实用程序类,特别是方法,其中可以传递一个函数,该函数返回具有回退值(
    t2
    )的
    ListenableFuture

    注意:在上一段代码中,我使用了
    catching
    而不是
    catchingAsync
    来与您问题中的代码保持一致,并且我没有指定执行者。您可能需要使用带有
    Async
    后缀的方法进行非阻塞处理

    package myHelper;
    
    ListenableFuture<T> fnHelper() {
      return Futures.transform(fnGrpc(), new Function<V, T>() {
        @Override
        public T apply(V v) {
          T t1 = f(v);
          return t1;
        }
      });
    } 
    
    package myApp;
    
    // ...
    
    try {
      T t = fnHelper().get();
    } catch (ExecutionException | InterruptedException ex) {
      // ...
    }
    
    ListenableFuture<Integer> faultTolerantFuture = Futures.catchingAsync(originalFuture,
                           Exception.class, x -> immediateFuture(t2), executor);
    
    ListenableFuture<T> fnHelper() {
        return Futures.catching(Futures.transform(fnGrpc(), new Function<V, T>() {
            @Override
            public T apply(V v) {
                T t1 = f(v);
                return t1;
            }
        }),
        Exception.class, x -> immediateFuture(t2));
    }