线程运行一个我无法控制的无限操作。如何阻止它? [复制]
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() 引发异常,而在我的情况下,这会使具有无限操作的线程停止。以上是关于线程运行一个我无法控制的无限操作。如何阻止它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章