TL; DR 当我知道Java线程没有与其他任何东西同步时,它是否可以使用?
首先,我将描述我的困境。我有一个服务来处理来自应用程序的请求(两者都在同一台机器上)。这项服务是单线程的。在某些情况下,回答请求可能需要一段时间。在这些情况下,我想暂停请求。 遗憾的是,在所述服务中轮询中断非常复杂,因为它具有相当广泛的算法逻辑,并且会导致大量难看的代码重写。
将服务视为一个称为可怕算法库的外观。 目前,该服务只是根据请求调用库,我希望它启动一个线程,并在计算时间过长时将其计时。 我打算只使用一个额外的线程。
我看了How do you kill a thread in Java?和https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
根据这些,由于失去同步,不推荐停止线程。但是,我的服务基本上是单线程的,因此不需要同步。
在这种情况下,我可以停止线程吗?我错过了一些内部java的东西吗?
谢谢!
答案 0 :(得分:3)
因此,您有一个处理请求的服务,有时这种处理可能需要一段时间。您想要放弃服务在放弃之前处理该请求所花费的最长时间。
您不想通过检查某些中断设置的标志来丢弃您的代码,因为代码很大且很复杂。
您的选择:
在单独的线程上处理每个请求。允许每个请求运行完成,并根据需要花费尽可能多的时间。考虑改进服务请求代码,可能使用并行性,以减少运行所需的时间。
这是第二个最佳答案 - 您可以控制程序决定停止处理响应的位置。您的程序可以可控地关闭请求处理,正确清理它需要的任何内容(可能打开文件,套接字等资源;在内部重置程序状态)。
不推荐调用Thread.stop()
,并且有充分的理由 - 它可以破坏同步状态。如果您的请求处理逻辑使用任何形式的同步,那么您将导致损坏。请记住,即使您没有看到同步,也会在任何地方使用同步。从文件读取使用同步形式。写入标准输出使用同步。
这是可能的,但这是一个糟糕的主意。
...
还有其他与#2相关的策略 - 例如,您可以重新构建程序,以便将每个处理部分创建为队列中的作业,一个线程负责出列和执行 - 基本上,消息泵图案。在这个设计中,你有一个很好的阻塞点,可以将你的超时时间排除在外。逻辑。这是大多数窗口框架使用的设计 - UI消息泵。