【问题标题】:Are there dangers to throwing a runtime exception forcibly into a thread with Thread.stop(Throwable)?使用 Thread.stop(Throwable) 强行将运行时异常抛出到线程中是否存在危险?
【发布时间】:2014-06-04 05:08:39
【问题描述】:

我正在编写一个相当大的多线程应用程序,线程具有许多不同的角色(例如事件处理、指标、网络)。目前,如果有任何无法处理的不一致,它将表现为异常。由于确实无法从其中一些恢复,我一直将它作为ApplicationDeathException 类型的运行时异常重新抛出。

任何需要处理关闭的类都会针对这个异常从一个 catch 块中调用它,然后重新抛出它以便它向上传播到堆栈。

我正在考虑通过调用Thread#stop(Throwable) 以同样的方式杀死所有其他线程。大多数都可以突然终止,并且可以在需要关闭逻辑时捕获此异常。他们将简单地让异常向上传播堆栈,在需要的地方执行关闭逻辑,并最终最终杀死线程。这种方法有没有我遗漏的隐患?

【问题讨论】:

    标签: java multithreading exception-handling


    【解决方案1】:

    Thread.stop 已被弃用,因为它不安全(请参阅 Javadoc)。而是让每个线程监视某种布尔标志(请参阅Java: How to stop thread? 以及可能在 SO 上无数其他线程)。

    在这种情况下,我通常会实现某种线程池管理器,负责干净地关闭正在运行的线程。那么当真的很糟糕的事情发生时,您只需要通知经理关闭即可。

    【讨论】:

    • 我知道您提到的是一种有效的方法。我目前的问题有点不同,即我的方法是否会遇到死锁或其他陷阱方面的危险。
    • 你的方法是否可能死锁真的取决于你的线程在做什么、你的实现、正在持有什么资源等。我认为你的方法看起来很合理(除了使用 Thread.stop),但是并不意味着没有发生死锁的机会。
    • 所有资源都在关机时释放,不需要显式获取任何新资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多