停止可能永远循环的线程

时间:2011-08-22 19:37:35

标签: java multithreading swing

我有一个程序,我将用户键入的java代码编译成文本字段,然后运行它。在单独的线程中运行代码,以便用于输入源代码的GUI不会被锁定。

GUI有一个应该停止线程的中止按钮。我的问题是我需要停止编译线程,无论它内部发生了什么,这意味着我必须考虑线程被无限循环捕获的情况(由于用户错误),并且它无法正常结束本身使用安全标志。我已经阅读了许多涉及使用某种标志的解决方案,但由于这种循环问题,我无法使用它们。我需要让线程停止并释放它正在使用的内存(我不能让它永远停留在后台,除非这是剩下的唯一解决方案)。任何建议或替代解决方案?希望一些新的观点可以帮助解决这个问题。

编辑:

以下是用户提交代码的示例:

public class RunMe extends SomethingThatRuns {
    public void run() {
        int i = 0;
        while (i = 0) {
            //Prepare to get stuck!
        }
    }
}

我将编译这个类,然后运行它。这就是卡住的地方,run()方法永远无法完成,甚至循环检查标志。

6 个答案:

答案 0 :(得分:2)

您可以在新的JVM中运行它,以便在需要时将其杀死。 考虑安全性这也是一件好事。

答案 1 :(得分:2)

在线程上调用stop()

是的,这是一种弃用的方法。但是,它确实不应该被“弃用”,它应该是“危险的”。但是,在某些情况下,除了使用它之外别无选择,并且用户提供的“代理”调用就是其中之一。

确保您的程序不使用此用户线程操纵的任何数据;或者,如果你这样做,设计一些事务机制来在线程之间安全地交换数据。

即使这种方法也不能保证终止线程。例如,用户可以捕获结果Throwable并忽略它。或者,如果线程在某些本机代码中,则线程实现可能不会响应stop()调用。但这是你最好的机会。

答案 2 :(得分:1)

这里的核心问题是代码甚至允许输入无限循环作为用户错误的一部分。解决这个问题,其他一切都会变得更容易处理。

正常行为的线程通常应该在没有工作要做的时候优雅地终止(或者安静地返回到线程池以请求更多的工作,如果这是你的应用程序的设计)。如果你觉得你需要让一个线程强行杀死另一个线程,那么你可能会遇到一个基本的设计问题。一个线程告诉另一个线程没关系,“嘿,你现在应该终止,以便我可以加入你......”因为这样可以让你的线程在完成后清理它们。强行销毁线程并不是管理这些情况的正确方法。

答案 3 :(得分:1)

您可以使用它们在每个循环中插入一个重复检查,也可以在其他地方插入。

我可以看到两个选项:

  • 在编译用户代码时,您可以先编辑它。你可以用 ANTLR用于解析和修改代码。
  • 有像ASM这样的字节码操作框架,允许您操作已经存在的代码 编译。

我认为这不容易,但可能是一种方式。

答案 4 :(得分:0)

interupt(); gui中的线程

并且在线程运行的代码中检查Thread.interrupted()并在特别是内部循环时抛出异常

答案 5 :(得分:0)

在高级别,你问的是一个线程如何停止另一个线程。为此,请参阅此问题Stopping a Thread in Java?