我在生产环境中有特殊情况,其中一段特定代码进入无限循环。原因主要是数据特定的,无法找出真正的原因。与此同时,我希望做的是生成一个单独的子线程来执行那段代码,如果它执行超过30秒,则要阻止该子线程执行
Thread t = new Thread() {
public void run() {
// This is where i will the method that runs in a infinite loop
callMethodThatRunsInInfiniteLoop();
};
};
t.start();
try {
t.join(2000); // wait 2s
} catch (InterruptedException e) {
e.printStackTrace();
}
// if not completed how to break the child thread ???
答案 0 :(得分:1)
有没有办法通过抛出异常来导致无限循环代码中断?例如设置一些变量 空值?一个可能的优点是受影响的线程(如果写得很好)将自行清理并比停止()更好地关闭。
答案 1 :(得分:1)
不幸的是,它不是第三方代码,并且无法轻易改变它。
听起来您正在尝试解决第三方库中的问题......或者在您的代码中调用输入错误的第三方库。
我的建议是解决这个问题,而不是试图杀死错误的线程。如果你不能这样做,那么你有两个选择:
将第三方库修改为中断感知/响应,然后用它来阻止它,或者
尝试找到一种方法“进入”第三方图书馆的数据结构(例如使用讨厌的反射)并使其死亡。
如果您使用后者,那么也许您还应该考虑在单独的JVM中运行第三方库,以便您可以使用Process API强制终止它。
话虽如此,但Thread.stop()
实际上(可能)安全使用的情况有限。基本上,如果错误的线程没有创建子线程,不与其他线程交互并且不共享数据结构,并且在你杀死它时不能进行类初始化,那么你可能强>要安全。问题是有太多的理论情况,停止线程可能会造成损害,很难知道你已经考虑了所有这些。
答案 2 :(得分:0)
所有用于“纯粹外部”停止线程的方法都已弃用,并被视为不安全。线程可以安全停止的唯一方式需要
stopMe
变量礼貌地要求停止;或如果没有这个,你别无选择,只能使用不安全的方法,这意味着Thread.stop()
,这也是非常糟糕的做法。这是一个非常糟糕的主意,当然唯一真正的解决方案是更改您的输入以便不会发生这种情况,或者修复第三方代码。
线程使用的任何对象可能处于不一致(并且可能不可用)的状态,因此尽量避免让Thread修改任何重要的东西,如果可以帮助它,不要查看它的任何输出变量。 / p>
{SE} 7中似乎仍存在Thread.stop()
方法,但当然已弃用,但我无法保证您的特定环境。
请参阅http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
答案 3 :(得分:0)
根据方法的实现,您可以在自己的JVM中启动它,然后通过在进程上调用destroy()
来停止它:
Process process = new ProcessBuilder("java", "-cp", "/some/class/path", "com.mycompany.MyLauncher").start();
// sometime later
process.destroy();