java - 如何杀死运行任意客户端代码的线程
问题描述
出于学术目的(阅读:大学课程),我正在构建一个加载和执行学生提交的代码的应用程序。
每个学生提交一个 .class 文件,该文件被加载,通过反射实例化,然后在自己的线程中执行。自定义安全管理器用于禁止访问白名单之外的类和方法。仍然可能的是学生代码中的无限循环。我希望能够使运行学生代码的线程超时,我不能依赖他们自己实现这个功能。
在 java 7 中,我可以使用 Thread.kill(),但自 java 8 起,此方法不再可用。我需要其他方法来强制终止运行可能包含无限循环的任意未知代码的线程。
如果有一些我不知道的漂亮技巧,请告诉我。非常感谢。
编辑:
该应用程序正在模拟一个多代理系统,学生在系统内提交代理的实现。代理之间的交互(通过访问超类的包私有字段实现)应该是可能的,而不需要学生实现某种命令行界面。据我所知,这排除了在单独的进程而不是线程中运行学生代码。
解决方案
Use Future
. Launch your students code as Future and specify timeout:
myFuture.get(long timeout, TimeUnit unit);
If it times out, catch the exception and then cancel this Future:
myFuture.cancel(true);
推荐阅读
- angular - 在 Angular 中过滤 Observable
- javascript - 如何在json文件上实现分页
- javascript - 如何快速找到对象之间的关系并嵌套它们
- php - 从 PHP 中的多维数组中获取值
- javascript - 带有 onclick 的 switch 语句不起作用
- php - json_encode 的控制台输出错误以在控制台中显示结果?
- java - Java ASM 字节码 - 查找属于特定方法调用的所有指令
- python - 如何增加来自 python 中 pyaudio 的字节数组的体积
- javascript - 异步函数调用不工作,同步工作
- archlinux - 无法完成 Arch Linux 安装指南