JDK8 CompletableFuture.supplyAsync如何处理interruptedException
CompletableFuture.supplyAsync( () -> { transporter.write(req); //here take the value from a blocking queue,will throw a interruptedException return responseQueue.take(); }, executorService);
处理interruptedException的常用方法是再次中断或直接抛出interruptedException,但两者都无法工作。 有人有想法吗?
我改变了这样的代码。
CompletableFuture 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;
由于lambda函数不支持抛出exception,我认为Java开发人员需要一个新的范例。 我想到的一件事如下:
public class ResultWrapper { E exception; R result; }
Lambda函数可以返回此包装器的实例。 (编辑:你的情况)
CompletableFuture> aFuture = ...; ... aFuture.supplyAsync( () -> { try { transporter.write(req); } catch(InterruptedException e) { ResultWrapper r = new ResultWrapper<>(); r.exception = e; r.result = null; return r; } ... }, executorService);
我遇到了同样的问题,但是在阅读了这里的评论和参考书之后,我认为你可以做以下两种中的任何一种:
1(我最终做的):
CompletableFuture.runAsync(() -> { transporter.write(req); try { Rep rep = responseQueue.take(); result.complete(rep); } catch (Exception e) { throw new CompletionException(e); } }, executorService); return result;
或2:
CompletableFuture result = new CompletableFuture<>(); new Thread(()-> { transporter.write(req); try { Rep rep = responseQueue.take(); result.complete(rep); } catch (Exception e) { retsult.completeExceptionally(e); } }).start();
我知道第二个不使用executorService
,但我觉得使用CompletableFuture的重点是在function风格中使用CompletionStage API。
- ClassNotFoundException与NoClassDefFoundError
- Java未选中/已检查exception澄清
- 是否可以使用exception来检查数组边界?
- 何时在Java中使用exception(示例)
- exception有多贵
- 使用try-with-resources静静地关闭资源
- H2 Java插入忽略 – 允许exception
- iText / BouncyCastle ClassNotFound org.bouncycastle.asn1.DEREncodable and org.bouncycastle.tsp.TimeStampTokenInfo
- Javaexception与C ++exception