首页 / JAVA / 如何取消Java 8可完成的未来?
如何取消Java 8可完成的未来?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何取消Java 8可完成的未来?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1452字,纯文字阅读大概需要3分钟。
内容图文
![如何取消Java 8可完成的未来?](/upload/InfoBanner/zyjiaocheng/705/27ec4103e9044da4841189bb918b4bef.jpg)
我正在玩Java 8可完成的期货.我有以下代码:
CountDownLatch waitLatch = new CountDownLatch(1);
CompletableFuture<?> future = CompletableFuture.runAsync(() -> {
try {
System.out.println("Wait");
waitLatch.await(); //cancel should interrupt
System.out.println("Done");
} catch (InterruptedException e) {
System.out.println("Interrupted");
throw new RuntimeException(e);
}
});
sleep(10); //give it some time to start (ugly, but works)
future.cancel(true);
System.out.println("Cancel called");
assertTrue(future.isCancelled());
assertTrue(future.isDone());
sleep(100); //give it some time to finish
使用runAsync我计划执行等待锁存器的代码.接下来我取消了未来,期望被抛入中断的异常.但似乎线程在await调用上仍然被阻塞,即使未来被取消(断言传递),也不会抛出InterruptedException.使用ExecutorService的等效代码按预期工作.它是CompletableFuture中的错误还是我的示例中的错误?
解决方法:
显然,这是故意的.方法CompletableFuture::cancel的Javadoc指出:
[Parameters:] mayInterruptIfRunning – this value has no effect in this implementation because interrupts are not used to control processing.
有趣的是,方法ForkJoinTask::cancel对参数mayInterruptIfRunning使用几乎相同的措辞.
我猜这个问题:
>中断旨在与阻塞操作一起使用,如睡眠,等待或I / O操作,
>但CompletableFuture和ForkJoinTask都不打算与阻塞操作一起使用.
CompletableFuture应该创建一个新的CompletionStage,而不是阻塞,而cpu绑定任务是fork-join模型的先决条件.因此,使用其中任何一个中断都会失败他们的目的.而另一方面,它可能会增加复杂性,如果按预期使用则不需要.
内容总结
以上是互联网集市为您收集整理的如何取消Java 8可完成的未来?全部内容,希望文章能够帮你解决如何取消Java 8可完成的未来?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。