Java:停止没有同步的线程

标签 java multithreading synchronization java-threads

长话短说 当我知道 Java 线程未与其他任何内容同步时,它是否适合 Java 线程?

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

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

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

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

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

谢谢!

最佳答案

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

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

您的选择:

  1. 不要放弃。

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

  1. 在您的代码中添加“停止时间”检查。

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

  1. 终止线程。

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

这是可能的,但这是一个糟糕的想法。

...

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

关于Java:停止没有同步的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48145712/

相关文章:

android - 等到对象不为 null 执行我的 if 条件 Java

c++ - 线程同步 - 微妙的问题

java - MultitClient 服务器 - 允许持续通信

c - 如何在多线程上下文中初始化静态变量?

c# - 传输事件处理程序中的SynchronizationContext.Post(…)

synchronization - 如何在 Realm 移动平台上跨不同用户同步?

java - 单选按钮不显示

java - 从输入字符串中提取多项式系数

java - 如何使用 JAXB 解码重复的嵌套类?

java - 模拟器上的背景被拉伸(stretch)