【问题标题】:Java - Terminate a threadJava - 终止线程
【发布时间】:2014-11-18 21:22:48
【问题描述】:

我想在不使用已弃用的 stop() 方法的情况下终止 java 中的线程。 我的线程中的 run() 方法调用了另一个方法,该方法执行的任务可能需要很长时间,我希望能够在它返回之前将其停止。

我的问题是我不想在从 run 调用的方法中处理这个问题,所以例如我不能使用全局布尔变量来终止线程,因为我无法在其中检查它方法。 有没有办法可以使用 interrupt() 方法来实现这个目标?

【问题讨论】:

  • 如果你真的卡住了,你能把线程孤立起来吗:设置它在从'long方法'重新调整时自行终止,将它的优先级设置为尽可能低,然后就忘了它吗?最终,它会自己死去,不受欢迎和不被爱……[呜咽]

标签: java multithreading


【解决方案1】:

简短回答:您必须重写长时间运行的方法,以便它检查,例如,一些全局布尔值或中断标志。根据下面 cmets 中的 assylias 建议,您可以例如执行while (!isInterrupted()) { ... }

如果您的长时间运行的方法处于某个(行为良好的)阻塞调用的中间,那么您将需要中断线程,使其从阻塞调用中提前返回,以便您可以检查条件以查看如果是时候终止了。

【讨论】:

  • 为什么使用布尔变量而不是标准的中断机制?
  • 我不明白你的论点 - IMO 一个长期运行的任务应该响应中断(这并不一定意味着立即终止)。所以我看不出在while(!isInterrupted()) 之上有一个while(!finish) 的意义。我可能误解了你的评论。
  • 如果长时间运行的方法没有埋在不透明的库中并且无法重写,那很好。
  • 嗯.. 也许你是对的。我遇到过两次交错阻塞调用的情况,例如while (keepRunning) { blockingA(); blockingB(); },我希望线程在某个事件时跳到下一个阻塞方法。我中断了线程以摆脱当前的阻塞调用,但我不希望它终止,除非 keepRunning 设置为 false。我开始怀疑这是一件明智的事情。更新我的答案...
  • @assylias,中断让我害怕,因为我不知道如果在我的代码调用第三方库时发生中断会发生什么。我还没有看到有关于它如何处理中断的明确文档的库。我希望任何中断的库调用都会抛出 InterruptedException,并让所有内容保持调用前的相同状态——这就是我将如何编写它——但在我的业务中,希望不会削减与 QA 部门联系。
猜你喜欢
  • 2012-08-28
  • 2015-12-21
  • 2011-08-11
  • 1970-01-01
  • 2023-03-28
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多