在我的应用程序中,在单独的线程中运行用户提交的代码[1],可能在某些情况下代码可能需要很长时间才能运行,或者甚至可能有无限循环!在那种情况下,我该如何停止该特定线程?
我无法控制用户代码,因此我无法从内部检查Thread.interrupted()。我也不能不小心使用Thread.stop()。我也不能将这些代码放在单独的进程中。
那么,无论如何都要处理这种情况吗?
[1]我正在使用JRuby,用户代码是ruby。
答案 0 :(得分:4)
根据您提供的限制条件:
Thread.interrupted()
。Thread.stop()
。你的问题的答案是“不,没有办法处理这种情况”。您已经系统地设计了一些东西,以便您无法控制不受信任的第三方代码。这是......次优设计。
如果你想要处理任何事情,你将不得不放松一个(或者更好的!)上述限制。
已编辑添加:
如果这是一个(其他)约束,可能会有一种解决方法,而不会强迫客户更改代码。在另一个进程中启动Ruby代码,并使用某种形式的IPC机制与主代码库进行交互。为了避免强制Ruby代码突然被编码为使用显式IPC,请为您的API提供一组代理对象,这些代理对象在后台执行IPC,它们自己在您自己的服务器中调用代理对象。这样,当你在自己的进程中监视代码时,你的客户端代码会被赋予在服务器内部工作的错觉(你最终可以kill -9
作为终极制裁来实现它。)
稍后你会想要让你的客户摆脱错觉,因为IPC和本地电话 非常不同,隐藏在代理后面可能是邪恶的,但它是你可以使用的权宜之计您弃用API并将客户端移至新API。
答案 1 :(得分:1)
我不确定这里的Ruby角度(或线程角度),但如果你正在运行用户提交的代码,你最好在一个单独的进程中运行它,而不是在一个单独的线程中运行它。同样的过程。
规则第一:永远不要相信用户输入。如果输入是代码则少得多!
干杯
答案 2 :(得分:0)
通常你有一个变量来表示停止一个线程。然后其他一些线程会将此变量设置为true。最后,定期检查变量是否已设置。
但鉴于您无法更改用户代码,我担心没有安全的方法。
答案 3 :(得分:-2)
对于正在运行的线程Thread.Interrupt
实际上不会像sfussenegger提到的那样停下来(感谢sfussenegger在阅读规范后重新收集)。
使用共享变量来表示它应该停止它正在做的事情。线程应该定期检查变量,(例如:使用while循环)并以有序的方式退出。
private boolean isExit= false;
public void beforeExit() {
isExit= true;
}
public void run() {
while (!isExit) {
}
}