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

Posted

技术标签:

【中文标题】线程运行一个我无法控制的无限操作。如何阻止它? [复制]【英文标题】: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) 导致无限循环 看看-How to timeout a thread 【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于线程运行一个我无法控制的无限操作。如何阻止它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行无限循环的线程限制为 1 个核心?

信号量无法阻止 Win32 控制台应用程序中的线程

一对一的多线程模型

在后台运行无限操作而不影响主线程的最佳方法?

是否有可能在Java中拥有无限循环的Thread和JFrame?

如何阻止我的脚本循环