出于学术目的(阅读:大学课程),我正在构建一个加载并执行学生提交的代码的应用程序。
每个学生都提交一个.class文件,该文件通过反射加载、实例化,然后在自己的线程中执行。自定义安全管理器用于禁止对白名单之外的类和方法的访问。然而,仍然有可能的是学生代码中的无限循环。我希望能够超时的线程运行学生的代码,我不能依赖他们实现这个功能本身。
在java 7中,我可以使用Thread.kill(),但是这个方法从java 8开始就不再可用了。我需要一些其他方法来强制杀死运行任意未知代码(可能包含无限循环)的线程。
如果有什么诡计我不知道,请告诉我。非常感谢。
编辑:
该应用程序模拟多agent系统,学生在系统内提交代理的实现。代理之间的交互(通过访问包-超类的私有字段实现)应该是可能的,而不需要学生实现某种命令行接口。据我所知,这排除了在单独的进程而不是线程中运行学生代码的可能性。
发布于 2019-10-11 21:57:12
使用Future
。启动您的学生代码作为未来并指定超时:
myFuture.get(long timeout, TimeUnit unit);
如果超时,请捕获异常,然后取消此未来:
myFuture.cancel(true);
https://stackoverflow.com/questions/58348403
复制相似问题