出于学术目的(阅读:大学类(class)),我正在构建一个应用程序,用于加载和执行学生提交的代码。
每个学生提交一个 .class 文件,该文件通过反射加载、实例化,然后在自己的线程中执行。自定义安全管理器用于禁止访问白名单之外的类和方法。但仍然可能的是学生代码中的无限循环。我希望能够使运行学生代码的线程超时,并且我不能依赖它们自己实现此功能。
在 java 7 中,我可以使用 Thread.kill(),但自 java 8 以来,此方法不再可用。我需要一些其他方法来强制终止运行可能包含无限循环的任意未知代码的线程。
如果有什么我不知道的巧妙技巧,请告诉我。非常感谢。
编辑:
该应用程序正在模拟一个多代理系统,学生在系统内提交代理的实现。代理之间的交互(通过访问父类(super class)的包私有(private)字段实现)应该是可能的,而不需要学生实现某种命令行界面。据我所知,这排除了在单独的进程而不是线程中运行学生代码的可能性。
最佳答案
使用 future
。作为 Future 启动您的学生代码并指定超时:
myFuture.get(long timeout, TimeUnit unit);
如果超时,捕获异常,然后取消这个Future:
myFuture.cancel(true);
关于java - 如何杀死运行任意客户端代码的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348403/