Java 线程运行一个我无法控制的无限操作。如何阻止它?

Java 线程运行一个我无法控制的无限操作。如何阻止它?,java,multithreading,Java,Multithreading,因此,我正在制作一个java代码测试web应用程序,并在一个单独的线程中运行每个代码执行。问题是,有时测试有时间限制,或者学生只是编写一个无限while循环。我试图用“最佳实践”终止我的测试线程,比如使用中断,但我无法控制编译函数的内部工作,因此我不能仅仅告诉线程是否被中断。我想听听如何更好地处理这种情况的建议。 以下是我想要实现的简单示例: public class Main { public static void main(String[] args) { Co

因此,我正在制作一个java代码测试web应用程序,并在一个单独的线程中运行每个代码执行。问题是,有时测试有时间限制,或者学生只是编写一个无限while循环。我试图用“最佳实践”终止我的测试线程,比如使用中断,但我无法控制编译函数的内部工作,因此我不能仅仅告诉线程是否被中断。我想听听如何更好地处理这种情况的建议。 以下是我想要实现的简单示例:


public class Main {
    public static void main(String[] args) {

        CodeExecutionThread cex = new CodeExecutionThread();

        cex.start();

        try {
            cex.join(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Thread should stop at this point.");

    }
}


class CodeExecutionThread extends Thread {

    public CodeExecutionThread() {

    }

    @Override
    public void run() {

        infinite_operation();

    }

    public void infinite_operation() {
        while(true) {
            System.out.println("thread active");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}


我不止一次遇到同样的问题

可能不是您想要的,但是可能没有比在工作线程内使用标志更好的方法了——例如,如下所述:

当使用标志时,主线程和辅助线程之间当然有一个契约——您需要将
无限_操作
划分为更小的块,并检查标志


如果你不想要那种契约,或者如果不可能的话,考虑使用一个进程,它可以被OS()安全地杀死。通常情况下,您需要内置功能来停止线程。您无法真正强制线程停止。你可以“善意地要求”打断它,让它停下来。被中断的线程需要处理中断。“while(true)”你想知道为什么会有无限循环吗?@Stultuske OP说这是一个测试应用程序,它执行的代码由其他人提交,这可能是一个无限操作。OP知道

,而(true)
会导致无限循环看看-你不需要这样做:你只需要以一种方式处理InterruptedException,中断线程意味着它停止,例如,将try/catch放在循环之外。如果您可以检查
中断的状态,那么就足够了,但是您可以直接检查标志。Imho可以更好地控制何时退出(即状态一致),并明确目的(在工作期间停止)。处理
InterruptedException
当然是一个很好的实践。对我来说,有效的方法就是使用stop()抛出异常,在我的例子中,它使无限操作的线程停止。