赞
踩
已解决java.util.concurrent.CancellationException异常的正确解决方法,亲测有效!!!
java.util.concurrent.CancellationException是 Java 并发编程中常见的异常,常出现在Future任务取消、线程池关闭、CompletableFuture等场景中。本文将详细分析此问题并给出解决方法。
我们先来看一个出现CancellationException的例子:
- ExecutorService executor = Executors.newSingleThreadExecutor();
- Future<String> future = executor.submit(() -> {
- Thread.sleep(1000);
- return "Task Completed";
- });
- future.cancel(true); // 取消任务
- System.out.println(future.get()); // 抛出 java.util.concurrent.CancellationException
在这个例子中,我们创建了一个任务并提交给ExecutorService执行。然后我们调用future.cancel(true)
取消这个任务,在尝试获取任务结果时,就会抛出CancellationException。
从代码中可以看出,CancellationException通常由于以下几种原因引起:
这样做会使正在运行的线程被中断,如果你试图获取结果,那么就会抛出CancellationException。
对于CancellationException的处理,我们需要根据具体情况采取不同的策略:
针对以上各种情况,我们可以采取以下几种策略来处理CancellationException:
- try {
- future.get();
- } catch (CancellationException e) {
- // handle cancellation scenario
- }
- if (!future.isDone()) {
- future.cancel(true);
- }
- executor.shutdown();
- try {
- if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
- executor.shutdownNow();
- }
- } catch (InterruptedException e) {
- executor.shutdownNow();
- }
- CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
- // some long running task
- });
- // 优雅地处理取消
- future.exceptionally(ex -> {
- if (ex instanceof CancellationException) {
- return "Task Cancelled";
- }
- return "Unexpected error";
- });
解决java.util.concurrent.CancellationException的关键是理解它的引发原因,并在代码中合理地处理任务取消和线程池关闭的情况。希望本文能帮助读者更好地理解并解决这个问题。
以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果本文对你有帮助 欢迎 关注 、点赞 、收藏 、评论, 博主才有动力持续记录遇到的问题!!!
博主v:XiaoMing_Java
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/462594
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。