已解决java.util.concurrent.CancellationException异常的正确解决方法,亲测有效!!!
已解决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通常由于以下几种原因引起:
- 调用了Future的cancel方法,取消了一个尚未完成的任务。
- 在一个已经被取消的Future对象上调用get()方法。
- 当ExecutorService关闭时,还有尚未开始的任务。
这样做会使正在运行的线程被中断,如果你试图获取结果,那么就会抛出CancellationException。
解决思路
对于CancellationException的处理,我们需要根据具体情况采取不同的策略:
- 如果是由于任务被取消导致的异常,我们应该检查我们的代码,确保我们在取消任务后不再调用Future.get()方法。
- 如果是由于ExecutorService关闭导致的异常,我们应该确保在关闭ExecutorService时,所有已提交的任务都已经完成。
解决方法
针对以上各种情况,我们可以采取以下几种策略来处理CancellationException:
- 捕获并处理CancellationException。当我们调用Future.get()时,我们应该预期可能会抛出CancellationException,并编写相应的错误处理代码。
try { future.get(); } catch (CancellationException e) { // handle cancellation scenario }
- 在取消任务之前,检查任务是否已经完成。只有当任务仍在运行时,我们才应该尝试取消它。
if (!future.isDone()) { future.cancel(true); }
- 在关闭ExecutorService之前,等待所有任务完成。这可以通过调用ExecutorService.awaitTermination()方法实现。
executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); } } catch (InterruptedException e) { executor.shutdownNow(); }
- 使用CompletableFuture而非原生Future。CompletableFuture提供了更灵活的异常处理机制,能有效消除CancellationException。
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
📫作者简介:嗨,大家好,我是 小明java问道之路,互联网大厂后端研发专家,2022博客之星TOP3 / 博客专家 / CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万粉丝博主。
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
原文地址:https://blog.csdn.net/FMC_WBL/article/details/135760202
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!