当前位置: 首页 > 知识库问答 >
问题:

whenComplete()中的异常会影响其派生的线程吗?

贺佑运
2023-03-14

我的印象是,在完成时放入的任何内容都发生在与生成它的线程完全分离的线程上。但今天我们遇到了一个事件,从我们的日志中可以看出,当完成时,似乎从内抛出了一个异常,就像异常是在一个常规链中抛出的一样(例如然后应用然后合成,等等),然后被一个异常捕获(在原始链中)。

这可能吗?怎样

我希望答案是不,这是不可能的,而且有一些奇怪的事情正在发生/我们误读了我们的日志或逻辑。


共有1个答案

汪建德
2023-03-14

CompletableFuture的Javadoc说:“...此方法并非旨在转换完成结果,因此提供的action不应抛出异常。”但是它会告诉您如果action确实抛出异常会发生什么...

似乎从whenComplete中抛出的异常冒了出来,就好像异常是在常规链中抛出的一样。

…Javadoc说,“如果此阶段正常完成,但提供的操作引发异常,则返回的阶段异常完成,提供的操作出现异常。”

这听起来像是你看到的行为。

对评论的回应:

但是如果任务B抛出异常导致任务A(正常完成后)抛出任务B的异常,那么这不是意味着任务A必须等待任务B吗?

不,没有等待。CompletableFuture可以通过两种方式完成:它可以正常完成(例如,好像通过完成(T

一段时间后,当其他线程最终调用future时。如果未来正常完成,get()将返回存储的值,但如果未来异常完成,则get()调用将抛出

实际上,抛出了两个异常;一个是报告发生时发生的任何最初的坏事情,另一个是延迟到其他线程调用。在您的示例中,当某个池线程执行您在完成(…,action)时提供给操作时,“坏事情”发生了。

 类似资料:
  • 问题内容: 说,我有以下mixin通过触摸彼此重叠: 如果我希望我的视图通过该命令,请检查A->检查B,我的代码应该是还是? 为什么我们总是将其子类或子类放在mixins之后?(我通过阅读django通用视图的源代码注意到了这一点,但我不知道其背后的原理,如果有的话) 问题答案: MRO基本上是深度优先,从左到右。有关更多信息,请参见新型Python类中的方法解析顺序(MRO)。 你可以查看要检查

  • 我正在eclipse上处理一个程序,遇到一个错误,上面写着:线程“main”java.lang.error:Unresolved compilation problem:at main.main(main.java:19)我是编程新手,如果您告诉我这个错误是什么,以及我如何修复它,这将非常重要。谢谢你!

  • 根据了解node.js事件循环,node.js支持单线程模型。这意味着如果我向node.js服务器发出多个请求,它不会为每个请求生成一个新线程,而是一个接一个地执行每个请求。这意味着如果我在node.js代码中对第一个请求执行以下操作,同时节点上出现一个新请求,第二个请求必须等到第一个请求完成,包括5秒的睡眠时间。对吗? 有没有一种方法可以让node.js为每个请求生成一个新线程,这样第二个请求就

  • 比如说,一个 mysql sevrer 有 100 个连接 这一百个连接什么 level 都有 假如现在执行一个 level 为 SERIALIZABLE 的 crud sql 什么,此时 mysql server 会停掉其他 99 个连接的 sql 来实现 SERIALIZABLE 吗? 这个问题的意思就是,SERIALIZABLE level 只会让其他 SERIALIZABLE level,

  • 问题内容: 每当我运行此命令时,该函数就可以正常使用。当我选择洞穴时,消息会每隔2秒弹出一次,然后当它越过该部分时,就会出现错误: 我已经尝试过和,并且在该方法中使用时,出现了很多错误。当我在方法中使用时,它不接受我的输入。 当我在该方法中使用时,它不接受我的字符串输入,而直接进入另一个游戏,但是布尔值返回并且它无限地发送垃圾邮件“ Which Cave …”。 我已经阅读了错误报告,以及类似问题

  • 问题内容: 我需要在Java中进行一次练习的帮助,也许我会在2小时内停留在此错误上。任何帮助都会很棒。 和: 我无法在Proizvod类的变量“ proizvodi”上输入字符串“ imer”或int“ cenar”。 有帮助吗?为什么我会收到此错误?谢谢! 问题答案: 扫描程序抛出此异常,以指示检索到的令牌与预期类型的​​模式不匹配,或者令牌超出预期类型的​​范围。