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

标签 java multithreading jruby

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

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

那么,有什么办法可以处理这种情况吗?

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

最佳答案

根据您提供的约束:

  1. 您无法控制用户提交的代码。
  2. 无法强制检查 Thread.interrupted()
  3. 无法使用Thread.stop()
  4. 无法将用户代码放入进程 jail 中。

您的问题的答案是“不,没有办法处理这种情况”。您几乎已经系统地设计了一些东西,以便您对不受信任的第三方代码具有零控制。这是......次优设计。

如果您希望能够处理任何事情,则必须放松上述限制中的一个(或最好是多个!)。

<小时/>

编辑添加:

如果这是一个(另一个)约束,您可能有一种方法可以解决这个问题,而无需强制您的客户更改代码。在另一个进程中启动 Ruby 代码,并使用某种形式的 IPC 机制与主代码库进行交互。为了避免强制 Ruby 代码突然必须编码为使用显式 IPC,请为您的 API 放入一组代理对象,这些对象在幕后执行 IPC,这些对象本身在您自己的服务器中调用代理对象。这样,您的客户端代码就会产生在服务器内部工作的错觉,同时您将该代码囚禁在自己的进程中(您最终可以 kill -9 作为最终制裁)。

稍后您将希望让您的客户摆脱这种幻想,因为 IPC 和 native 调用非常不同,将其隐藏在代理后面可能是邪恶的,但这是您可以使用的权宜之计您弃用 API 并将您的客户端转移到新的 API。

关于Java - 如何停止运行任意代码的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5218641/

相关文章:

java - Checkstyle eclipse 插件 : error cannot initialize module TreeWalker Token "WILDCARD_TYPE"

objective-c - 使用 coredata 和多线程枚举时集合发生了变化

java - 使用 ScheduledExecutorService 方法定期运行一批任务

tomcat - Jruby On Rails 应用程序在使用 Warble 进行 WAR 时在 Tomcat 上给出 LocalJumpError

ruby - 在简单的 Sinatra 应用程序中了解 ruby​​ 多线程

java - 在骰子值上找到可能的节点

java - GWT 访问网格元素值

java - 使 gwt 按钮透明

java - 如何创建 session 范围的线程安全对象实例?

ruby-on-rails - 钉枪模式下 JRuby 1.7 上的 Rails 应用程序无法启动