【问题标题】:java : stop safety a thread; not using while and boolean flagjava:停止安全线程;不使用 while 和布尔标志
【发布时间】:2011-09-03 08:01:10
【问题描述】:

我有一个线程只执行一次任务。如果它无法在适当的时间做到这一点,我想停止它。我怎样才能做到这一点?我之前看到的所有方法都使用了一个while循环和一个标志来完成多次执行的任务;但我的任务不是这样的。

谢谢大家。

【问题讨论】:

    标签: java multithreading thread-safety


    【解决方案1】:

    停止任务的唯一干净方法是中断它(或设置一些其他标志),这会导致线程正常停止。如果您的代码中没有外循环,您可以在可以安全中断工作流程的各个关键点检查它。对于大型代码库来说,这可能很乏味,但这是最好的方法。

    如果您有一个无法控制的库,则可以使用 Thread.stop() 但这会使您的应用程序处于未定义状态。它不会像这样杀死线程,但会触发 ThreadDeath 错误,该错误将展开堆栈并调用 finally 块等。问题是它会发生在有效随机的代码行中(甚至在一行代码的一半) 线程可以忽略 ThreadDeath 错误,具体取决于代码的编写方式。

    解决此问题的唯一方法是在另一个进程中运行不受信任的代码,然后在该进程耗时过长时终止该进程。这可能会留下临时文件,但这是一个更安全的选择。

    【讨论】:

    • 嗨,ThreadDeath 是如何工作的?有可能抓住它吗?如果我们无法捕捉到它是什么意思“它不会像这样杀死线程,但会触发 ThreadDeath 错误,该错误将展开堆栈并调用 finally 块等。”
    • ThreadDeath extends Error 并且它可以像任何其他 Error 或 Throwable 一样被捕获(并且可能被忽略)。
    • Erm.. 你知道如何捕捉吗?我看到 Java 文档 thread.stop() 没有抛出这个异常。
    • 您一定是在阅读不同的 Javadoc,因为这正是它所说的,甚至警告了捕获它的危险。 docs.oracle.com/javase/7/docs/api/java/lang/…
    • o.. 我的错误,我只看到了 SecurityException(在“抛出”区域),所以我认为它不是来自 thread.stop(),我只是意识到它是未经检查的异常。跨度>
    【解决方案2】:

    使用java.util.TimerTask 类 - 用于安排一个任务由定时器一次性或重复执行。

    【讨论】:

    • 首先谢谢。但是: Timer 任务有一个取消方法,用于取消它的执行,如果在调用发生时任务正在运行,则任务将运行到完成,但永远不会再次运行。我希望任务在我停止时停止;我不希望任务在一段时间后完成。
    • 这适用于任务已安排但尚未开始但一旦开始就不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多