【问题标题】:Thread runs an infinite operation which I have no control over. How to stop it? [duplicate]线程运行一个我无法控制的无限操作。如何阻止它? [复制]
【发布时间】:2020-10-04 15:37:33
【问题描述】:

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

【问题讨论】:

  • 操作无限是有原因的吗?通常你会想要内置功能来让你停止线程。
  • 您不能真正强制线程停止。您可以通过打断它来“请它”停止。被中断的线程需要处理中断。
  • "while(true)" 你想知道为什么会有无限循环吗?
  • @Stultuske OP 说它是一个测试应用程序,它执行的代码由其他人提交,可能是无限操作。 OP 知道 while(true) 导致无限循环

标签: java multithreading


【解决方案1】:

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

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

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

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

【讨论】:

  • 您不需要这样做:您只需要以中断线程意味着它停止的方式处理 InterruptedException,例如将 try/catch 放在循环之外。
  • 如果您可以检查interrupted 状态就足够了——但您可以直接检查标志。恕我直言,它提供了更好的控制何时退出(即状态是一致的)并使目的(在工作期间停止)明确。处理InterruptedException当然是个好习惯。
  • 对我有用的只是使用 stop() 引发异常,而在我的情况下,这会使具有无限操作的线程停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多