java - 线程运行一个我无法控制的无限操作。如何阻止它?
问题描述
所以我正在制作一个 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();
}
}
}
}
解决方案
我不止一次遇到同样的问题。
可能不是您要找的东西,但可能没有比在工作线程中使用标志更好的方法了 - 如此处所述,例如:https ://www.baeldung.com/java-thread-stop
使用标志时,主线程和工作线程之间当然存在契约——您需要将其infinite_operation
分成更小的块并检查标志。
如果您不想要那种合同或者如果不可能,请考虑使用一个可以被操作系统“安全”杀死的进程(https://www.baeldung.com/java-process-api)。
推荐阅读
- javascript - 使用 Js 将图标转换为按钮
- zsh - 如何在zsh中的第二个符号之后/之前捕获文本
- arrays - 在C中编辑char数组,输出切断
- python - 为什么谷歌爬虫没有得到谷歌搜索照片?
- angularjs - 如何使用 angularJS 同步本地文件系统的文件以上传
- c# - 为什么自定义 FrameworkElement 不显示子级?
- r - R中n个变量的m个函数
- reactjs - 如何将 TS4.3 中的 noImplicitOverride 标志与 React 类组件一起使用
- python - 在 Django 模板标签中传递和使用字典
- c# - 从运行时类型 C# 创建填充列表<>