我目前正在开发一个程序来运行用户提供的外部代码(假设这种情况是合理的)。经过大量的研究,我发现大多数涉及此问题的安全性都可以由SecurityManager处理;但是,如果外部代码花费的时间太长并且打算恶意,我很难找到杀死外部代码的方法。例如,如果外部代码如下所示:
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// Oh well, keep running
}
}
这将永远运行,Thread.interrupt()
不会做任何事情来阻止线程。是否有另一种方法来阻止不会导致任何问题的流氓线程?我所遇到的只是Thread.stop()
但是它似乎不是一个选项,似乎与它有关的所有问题。如果没有,是否还有其他选项可以运行此代码,程序仍然可以直接与它连接?
答案 0 :(得分:0)
刚刚杀死执行代码的java进程。
假设使用GNU / Linux或macOS系统:
ps -ax | grep java # identify the correct process
kill $pid # kill it
您可以通过访问Runtime:
在Java中执行此操作Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","cmd 1 goes here"});
编辑:
考虑到你还需要编译用户提供的代码,编译它并在自己的jvm中启动它是有意义的。
此外,在完全虚拟机中执行代码将是理想的,因为代码是沙箱化的,无法访问主机。
答案 1 :(得分:0)
我相信在Java中没有办法像你正在描述的那样杀死一个线程。如果线程正在执行,它只是设置一个标志,它由线程来注意它或中断线程等待或在睡眠中将抛出的模式 InterruptedException
唯一的办法就是杀死线程正在运行的进程。
call System.exit(int)