防止在Java中创建/启动线程

时间:2014-03-06 04:06:23

标签: java multithreading securitymanager

我的问题,类似于

why java security manager doesn't forbid neither creating new Thread() nor starting it?

我正在编写一个教学应用程序,允许学生提交执行某些任务的Java代码,并相互交互。

我们需要安全地加载,编译和执行一些代码。

使用Java工具,我们可以在内存中完成代码的编译;然后一个自定义类加载器加载代码,代码在一个线程中执行,具有一定的超时时间,并使用自定义安全管理器。

但是,学生仍然可以在他们的代码中创建Threads,将它们设置为循环并最终耗尽System / Tomcat资源。

有没有办法阻止创建线程?引用的答案说:

"""From your perspective, just change the policy."""

这在实践中意味着什么?

我试图覆盖方法checkPermission(Permission)和checkAccess(ThreadGroup),但我仍然无法拦截线程创建/启动

2 个答案:

答案 0 :(得分:4)

您引用的other question的已接受答案是错误的。为了防止代码创建新线程,您需要将标准Java SecurityManager子类化,并覆盖getThreadGroup或checkAccess(ThreadGroup)。我已经用详细信息发布了对另一个问题的答案。

答案 1 :(得分:0)

看起来你想要做的就是创建另一个JVM(例如java进程),如果事情失控,可以批量杀死它。你有什么理由不这样做吗?

您还可以将自己的jar添加到新JVM的类路径中,并使用JAR作为入口点。这样,您可以在怀疑代码运行之前设置自定义安全管理器之类的东西。您还可以在具有受限权限的帐户下运行JVM,以防止恶意系统交互。