java – 如何中断CompletableFuture :: join?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何中断CompletableFuture :: join?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1519字,纯文字阅读大概需要3分钟。
内容图文
我发现CompletableFuture :: join在未完成时似乎是不可中断的:
// CompletableFuture::join implementation from JDK 8 sources
public T join() {
Object r;
return reportJoin((r = result) == null ? waitingGet(false) : r);
}
在上面的实现中,waitingGet(false)将忽略工作线程的中断标志并继续等待.我想知道如何中断我称之为CompletableFuture :: join的Thread.
解决方法:
如果要支持中断,请不要使用join(),而是使用get().基本上它们是相同的,除了:
> join()仅在CompletableFuture中定义,而get()来自表单接口Future
> join()在CompletionException中包装异常,而get()在ExecutionException中包装它们
> get()可能会被中断,然后会抛出InterruptedException
请注意,您打断的是Thread,而不是Future.例如,以下代码在等待myFuture.get()时中断主线程:
CompletableFuture<Void> myFuture = new CompletableFuture<>();
Thread mainThread = Thread.currentThread();
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000);
System.out.println("Interrupting…");
mainThread.interrupt();
Thread.sleep(1000);
System.out.println("Completing");
myFuture.complete(null);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
try {
myFuture.get();
System.out.println("Get succeeded");
} catch (Exception e) {
System.out.println("Get failed");
e.printStackTrace();
}
输出:
Interrupting…
Get failed
java.lang.InterruptedException
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:347)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at CompletableFutureInteruption.main(CompletableFutureInteruption.java:37)
…
如果用join()替换get(),则中断确实不起作用.
内容总结
以上是互联网集市为您收集整理的java – 如何中断CompletableFuture :: join?全部内容,希望文章能够帮你解决java – 如何中断CompletableFuture :: join?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。