首页 > 解决方案 > 如何杀死运行任意客户端代码的线程

问题描述

出于学术目的(阅读:大学课程),我正在构建一个加载和执行学生提交的代码的应用程序。

每个学生提交一个 .class 文件,该文件被加载,通过反射实例化,然后在自己的线程中执行。自定义安全管理器用于禁止访问白名单之外的类和方法。仍然可能的是学生代码中的无限循环。我希望能够使运行学生代码的线程超时,我不能依赖他们自己实现这个功能。

在 java 7 中,我可以使用 Thread.kill(),但自 java 8 起,此方法不再可用。我需要其他方法来强制终止运行可能包含无限循环的任意未知代码的线程。

如果有一些我不知道的漂亮技巧,请告诉我。非常感谢。

编辑:

该应用程序正在模拟一个多代理系统,学生在系统内提交代理的实现。代理之间的交互(通过访问超类的包私有字段实现)应该是可能的,而不需要学生实现某种命令行界面。据我所知,这排除了在单独的进程而不是线程中运行学生代码。

标签: javamultithreadingtimeout

解决方案


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);

推荐阅读