【发布时间】:2011-09-03 08:01:10
【问题描述】:
我有一个线程只执行一次任务。如果它无法在适当的时间做到这一点,我想停止它。我怎样才能做到这一点?我之前看到的所有方法都使用了一个while循环和一个标志来完成多次执行的任务;但我的任务不是这样的。
谢谢大家。
【问题讨论】:
标签: java multithreading thread-safety
我有一个线程只执行一次任务。如果它无法在适当的时间做到这一点,我想停止它。我怎样才能做到这一点?我之前看到的所有方法都使用了一个while循环和一个标志来完成多次执行的任务;但我的任务不是这样的。
谢谢大家。
【问题讨论】:
标签: java multithreading thread-safety
停止任务的唯一干净方法是中断它(或设置一些其他标志),这会导致线程正常停止。如果您的代码中没有外循环,您可以在可以安全中断工作流程的各个关键点检查它。对于大型代码库来说,这可能很乏味,但这是最好的方法。
如果您有一个无法控制的库,则可以使用 Thread.stop() 但这会使您的应用程序处于未定义状态。它不会像这样杀死线程,但会触发 ThreadDeath 错误,该错误将展开堆栈并调用 finally 块等。问题是它会发生在有效随机的代码行中(甚至在一行代码的一半) 线程可以忽略 ThreadDeath 错误,具体取决于代码的编写方式。
解决此问题的唯一方法是在另一个进程中运行不受信任的代码,然后在该进程耗时过长时终止该进程。这可能会留下临时文件,但这是一个更安全的选择。
【讨论】:
ThreadDeath extends Error 并且它可以像任何其他 Error 或 Throwable 一样被捕获(并且可能被忽略)。
使用java.util.TimerTask 类 - 用于安排一个任务由定时器一次性或重复执行。
【讨论】: