Java - 如何阻止线程运行任意代码?

时间:2011-03-07 10:42:45

标签: java multithreading jruby

在我的应用程序中,在单独的线程中运行用户提交的代码[1],可能在某些情况下代码可能需要很长时间才能运行,或者甚至可能有无限循环!在那种情况下,我该如何停止该特定线程?

我无法控制用户代码,因此我无法从内部检查Thread.interrupted()。我也不能不小心使用Thread.stop()。我也不能将这些代码放在单独的进程中。

那么,无论如何都要处理这种情况吗?

[1]我正在使用JRuby,用户代码是ruby。

4 个答案:

答案 0 :(得分:4)

根据您提供的限制条件:

  1. 用户提交的代码,您无法控制。
  2. 无法强制检查Thread.interrupted()
  3. 无法使用Thread.stop()
  4. 无法将用户代码放入进程监狱。
  5. 你的问题的答案是“不,没有办法处理这种情况”。您已经系统地设计了一些东西,以便您无法控制不受信任的第三方代码。这是......次优设计。

    如果你想要处理任何事情,你将不得不放松一个(或者更好的!)上述限制。


    已编辑添加:

    如果这是一个(其他)约束,可能会有一种解决方法,而不会强迫客户更改代码。在另一个进程中启动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) {

    }
}