当前位置: 首页 > 知识库问答 >
问题:

线程运行一个我无法控制的无限操作。如何阻止?[副本]

巫马曜文
2023-03-14

因此,我正在制作一个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();
            }
        }
    }
}

共有1个答案

白刚洁
2023-03-14

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

可能不是您想要的,但可能没有比在工作线程中使用标志更好的方法了--例如,这里描述的是:https://www.baeldung.com/java-thread-stop(https://www.baeldung.com/java-thread-stop

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

如果您不想要那种契约或者不可能,请考虑使用一个进程,它可以被OS“安全地”杀死(https://www.baeldung.com/java-process-api)。

 类似资料:
  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 我试图在中运行控制台应用程序,但出现错误。 异常“yii\base\UnknownPropertyException”,在F:\xampp\htdocs\mdc\vendor\yiisoft\yii2\base\Component中显示消息“设置未知属性:yii\console\Response::formatters”。菲律宾比索:209 Common\config\main本地。php Cro

  • 我正在尝试构建一个worker verticle,通过采用kotlin的PubSub示例,结合这个关于worker无限阻塞循环处理的答案,将Google cloud PubSub主题订阅与vert.x的事件总线连接起来。 它确实有效,但Vert. X在收到来自PubSub的消息后的某个时间通过抛出异常来不断唠叨的日志(请暂时忽略阻止初始化): 这是源代码: 我显然错过了一些东西。此外,如果您有更好

  • 我试图制作一个时钟,如果 如何同时运行警告语音和时钟,使时钟在播放警告语音()时不会停止? 语音代码: 时钟代码:

  • 问题内容: 我的Android应用程序中的Java线程有问题。我的嵌套线程阻塞了我的UI,我该如何解决? MyClass.java 这就是我的运行方式: 你可以帮帮我吗?我真的卡住了;) 问题答案: 我的嵌套线程阻止了我的UI 您需要使用而不是。也就是说,更换 与 (这只是一个普通方法。实际上是产生一个新线程并随后运行的方法)