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)
我遇到了同样的问题,但是在阅读了这里的评论和参考书后,我认为您可以执行以下两个操作之一:
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。
| 归档时间: |
|
| 查看次数: |
15521 次 |
| 最近记录: |