【问题标题】:Java: Is catching exceptions asynchronous?Java:捕获异常是异步的吗?
【发布时间】:2011-02-14 22:41:48
【问题描述】:

我问是因为如果不是,它可以被滥用为同步机制。我在问Java。

【问题讨论】:

    标签: java multithreading exception asynchronous


    【解决方案1】:

    我不确定您所说的“可以被滥用为同步机制”是什么意思——这没有意义。

    Exceptions are per thread - 当抛出异常时,当前线程的执行跳转到异常被捕获的地方。如果它根本没有被抓住,线程就会死掉。其他线程不受影响。

    【讨论】:

    • 我想实现例如消费者-生产者通过抛出和异常,如果同步可以用作捕获块中处理的事件。
    • @Gabriel:不,它不能(除非我完全误解了你)。抛出异常的线程总是会捕获异常。
    【解决方案2】:

    JLS 11.3.2 Handling Asynchronous Exceptions

    大多数异常是同步发生的,因为它们发生在线程中,并且在程序中指定可能导致此类异常的某个点处发生。相比之下,异步异常是可能在程序执行的任何时候发生的异常。

    如果要生成高质量的机器代码,必须正确理解异步异常的语义。

    异步异常很少发生。它们仅由于以下原因而发生:

    • 调用类 Thread 或 ThreadGroup 的 stop 方法
    • Java 虚拟机内部错误

    所以不,虽然很少见,但并非所有 Exception 处理都是同步的。

    【讨论】:

      【解决方案3】:

      不,它是同步的。

      尝试使用调试器单步执行您的代码,您会看到它逐行执行,如果您在 catch 内中断,将不会继续。

      【讨论】:

      • 这根本不是真的。
      【解决方案4】:

      在线程执行期间发生异常。异步捕获没有意义,因为线程必须处理异常。在捕获并处理异常之前,它无法继续。如果异常没有被捕获或抛出,线程不知道它必须做什么并且简单地死掉并且程序可能/可能不会行为不端。

      线程抛出异常然后不等待捕获就继续执行是没有意义的。

      为了回答您的问题,对于所有实际目的而言,没有捕获不是异步的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-12
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多