Java打破了无限循环

时间:2012-08-08 22:57:01

标签: java

我在生产环境中有特殊情况,其中一段特定代码进入无限循环。原因主要是数据特定的,无法找出真正的原因。与此同时,我希望做的是生成一个单独的子线程来执行那段代码,如果它执行超过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 ???

4 个答案:

答案 0 :(得分:1)

有没有办法通过抛出异常来导致无限循环代码中断?例如设置一些变量  空值?一个可能的优点是受影响的线程(如果写得很好)将自行清理并比停止()更好地关闭。

答案 1 :(得分:1)

  

不幸的是,它不是第三方代码,并且无法轻易改变它。

听起来您正在尝试解决第三方库中的问题......或者在您的代码中调用输入错误的第三方库。

我的建议是解决这个问题,而不是试图杀死错误的线程。如果你不能这样做,那么你有两个选择:

  • 将第三方库修改为中断感知/响应,然后用它来阻止它,或者

  • 尝试找到一种方法“进入”第三方图书馆的数据结构(例如使用讨厌的反射)并使其死亡。

如果您使用后者,那么也许您还应该考虑在单独的JVM中运行第三方库,以便您可以使用Process API强制终止它。


话虽如此,但Thread.stop()实际上(可能)安全使用的情况有限。基本上,如果错误的线程没有创建子线程,不与其他线程交互并且不共享数据结构,并且在你杀死它时不能进行类初始化,那么你可能要安全。问题是有太多的理论情况,停止线程可能会造成损害,很难知道你已经考虑了所有这些。

答案 2 :(得分:0)

所有用于“纯粹外部”停止线程的方法都已弃用,并被视为不安全。线程可以安全停止的唯一方式需要

  1. 修改正在运行的代码,检查是否通过设置的某个stopMe变量礼貌地要求停止;或
  2. 选择另一个线程已经使用的变量来导致线程退出(这通常是非常糟糕的做法);例如,强制它抛出异常,如user949300所示。
  3. 如果没有这个,你别无选择,只能使用不安全的方法,这意味着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();