Java: 停止没有同步的线程

Java: stopping a thread with no synchronization

长话短说;博士 当我知道 Java 线程未与其他任何内容同步时,它是否可以?

首先我将描述我的困境。我有一项服务可以处理来自应用程序的请求(都在同一台机器上)。该服务是单线程的。在某些情况下,回答请求可能需要一段时间。在这些情况下,我想暂停请求。 可悲的是,在所述服务中轮询中断非常复杂,因为它具有相当广泛的算法逻辑,并且会导致大量难看的代码重写。

将服务视为调用可怕算法库的外观。 目前该服务只是根据请求调用库,我希望它启动一个线程,如果计算时间太长则超时。 我打算只使用一个额外的线程。

我读了How do you kill a thread in Java? and https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

根据这些,由于失去同步而停止线程已被弃用。但是,我的服务基本上是单线程的,因此不需要同步。

在这种情况下,我可以停止线程吗?我是否遗漏了一些内部 java 内容?

谢谢!

所以你有一个处理请求的服务,有时处理可能需要一段时间。您想要规定您的服务在放弃之前可以花在处理该请求上的最长时间。

您不想让您的代码乱七八糟地检查某个中断会设置的标志,因为代码又大又复杂。

您的选择:

  1. 不要放弃。

在单独的线程上处理每个请求。允许每个请求 运行 完成,根据需要花费尽可能多的时间。考虑改进服务请求代码,可能使用并行性,以减少 运行.

所需的时间
  1. 用 'time to stop' 检查乱丢你的代码。

这是第二好的答案 - 您已经控制了程序决定停止处理响应的位置的访问权限。您的程序可以可控地关闭请求处理,适当地清理它需要的任何东西(可能打开文件、套接字等资源;在内部重置程序状态)。

  1. 终止线程。

调用 Thread.stop() 已被弃用,并且有充分的理由 - 它会破坏同步状态。如果您的请求处理逻辑使用任何形式的同步,那么您将导致损坏。请记住,同步无处不在,即使您看不到它。从文件中读取使用一种同步形式。写入标准输出使用同步。

这是可能的,但这是个糟糕的主意。

...

还有与#2 相关的其他策略 - 例如,您可以重组程序,以便将每个处理部分创建为队列上的一个作业,一个线程负责出列和执行 - 基本上,消息泵模式。在此设计中,您将有一个很好的瓶颈来放置您的 'timed out' 逻辑。这是大多数窗口框架使用的设计 - UI 消息泵。