在我的应用程序中,在单独的线程中运行用户提交的代码[1],在某些情况下,代码可能需要很长时间才能运行,甚至可能有无限循环!在这种情况下,我该如何停止该特定线程?
我无法控制用户代码,因此我无法从内部检查 Thread.interrupted() 。我也不能粗心地使用Thread.stop()。我也无法将这些代码放在单独的进程中。
那么,有什么办法可以处理这种情况吗?
[1] 我正在使用 JRuby,用户代码是用 ruby 编写的。
最佳答案
根据您提供的约束:
- 您无法控制用户提交的代码。
- 无法强制检查
Thread.interrupted()
。 - 无法使用
Thread.stop()
。 - 无法将用户代码放入进程 jail 中。
您的问题的答案是“不,没有办法处理这种情况”。您几乎已经系统地设计了一些东西,以便您对不受信任的第三方代码具有零控制。这是......次优设计。
如果您希望能够处理任何事情,则必须放松上述限制中的一个(或最好是多个!)。
<小时/>编辑添加:
如果这是一个(另一个)约束,您可能有一种方法可以解决这个问题,而无需强制您的客户更改代码。在另一个进程中启动 Ruby 代码,并使用某种形式的 IPC 机制与主代码库进行交互。为了避免强制 Ruby 代码突然必须编码为使用显式 IPC,请为您的 API 放入一组代理对象,这些对象在幕后执行 IPC,这些对象本身在您自己的服务器中调用代理对象。这样,您的客户端代码就会产生在服务器内部工作的错觉,同时您将该代码囚禁在自己的进程中(您最终可以 kill -9
作为最终制裁)。
稍后您将希望让您的客户摆脱这种幻想,因为 IPC 和 native 调用非常不同,将其隐藏在代理后面可能是邪恶的,但这是您可以使用的权宜之计您弃用 API 并将您的客户端转移到新的 API。
关于Java - 如何停止运行任意代码的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5218641/