JDK8 CompletableFuture.supplyAsync如何处理interruptedException

Gra*_*aBa 14 java lambda exception java-8

CompletableFuture.supplyAsync(
() -> {
    transporter.write(req);
    //here take the value from a blocking queue,will throw a interruptedException
    return responseQueue.take();
},  executorService);
Run Code Online (Sandbox Code Playgroud)

处理interruptedException的常用方法是再次中断或直接抛出interruptedException,但两者都无法工作.有人有想法吗?

Gra*_*aBa 16

我改变了这样的代码.

    CompletableFuture<Rep> result = new CompletableFuture<>();
    CompletableFuture.runAsync(() -> {

        transporter.write(req);
        try {
            Rep rep = responseQueue.take();
            result.complete(rep);
        } catch (InterruptedException e) {
            result.completeExceptionally(e);
            Thread.currentThread().interrupt();
        } catch (Exception e) {
            result.completeExceptionally(e);
        }

    }, executorService);
    return result;
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是completablefuture已经有了计算结果的抽象,所以我不想为它创建新的类型。 (2认同)

der*_*dji 5

我遇到了同样的问题,但是在阅读了这里的评论和参考书后,我认为您可以执行以下两个操作之一:

1(我最终要做什么):

CompletableFuture.runAsync(() -> {
    transporter.write(req);
    try {
        Rep rep = responseQueue.take();
        result.complete(rep);
    } catch (Exception e) {
        throw new CompletionException(e);
    }
}, executorService);
return result;
Run Code Online (Sandbox Code Playgroud)

或2:

CompletableFuture<Rep> result = new CompletableFuture<>();
new Thread(()-> {
    transporter.write(req);
    try {
        Rep rep = responseQueue.take();
        result.complete(rep);
    } catch (Exception e) {
        retsult.completeExceptionally(e);
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

我知道第二个不使用executorService,但是我觉得使用CompletableFuture的全部目的是利用功能风格的CompletionStage API。