首页 > 解决方案 > 线程运行一个我无法控制的无限操作。如何阻止它?

问题描述

所以我正在制作一个 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();
            }
        }
    }
}

标签: javamultithreading

解决方案


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

可能不是您要找的东西,但可能没有比在工作线程中使用标志更好的方法了 - 如此处所述,例如:https ://www.baeldung.com/java-thread-stop

使用标志时,主线程和工作线程之间当然存在契约——您需要将其infinite_operation分成更小的块并检查标志。

如果您不想要那种合同或者如果不可能,请考虑使用一个可以被操作系统“安全”杀死的进程(https://www.baeldung.com/java-process-api)。


推荐阅读