【问题标题】:Stopping/Interrupting a thread after time limit在时间限制后停止/中断线程
【发布时间】:2016-12-13 16:49:40
【问题描述】:

我有一个使用第三方 jar 来执行某些任务的应用程序。我的应用程序使用 Spring Executor 池来生成线程。

问题: 如果执行时间超过时间限制,我需要停止当前线程的执行

我做了什么: 我用谷歌搜索了很多关于中断线程的信息。大多数人说要检查中断标志线程是否被中断,如果被中断,则抛出中断异常。但是在线程中,我调用了一个第三方 jar 中的方法,该方法完成了大部分工作,所以我不能去那里更改检查中断标志的代码。

考虑以下代码sn-p:

public void run() {
     boolean isDone = false;
     isDone = callThirdPartyMethod(); // here for some inputs thread takes more time (even never return for an hour!!) to process which I don't want and I need to stop/interrupt the thread
}

我遵循的停止/中断它的方法

  1. 我写了一个 TimerTask 检查线程是 超过时间限制并在它们上调用中断()(但它 他们继续执行时似乎什么也没发生)。
  2. 我将 TimerTask 的代码从中断它更改为调用 线程上的 stop()。这可行,但会引发 ThreadDeath 错误。 此外,我在大多数博客甚至 stackoverflow 中读到的内容是 我们永远不应该调用 stop 方法。

【问题讨论】:

  • 一个设计良好的第三方库应该能正确处理中断信号。也许您应该考虑选择另一个库。
  • 你可以试试这个方法:stackoverflow.com/questions/6859681/…
  • @waltersu 无法更改库。
  • @apruden 这种方法对我不起作用
  • 调用 thread.stop 是个坏主意。它可能工作正常,或者它可能会破坏数据结构,以至于所有未来的请求都返回不正确的数据。这就是该函数被弃用的原因——因为一个线程不能被外部源安全地停止。除非您打算立即重新启动应用程序,否则永远不要相信停止。

标签: java spring multithreading thread-safety


【解决方案1】:

问题:如果执行时间超过时间限制,我需要停止当前线程的执行

这里没有简单的答案。通常,您创建一个线程来进行第三方库调用,并创建一个线程来监视时钟并在计时器到期时终止另一个线程。

您可以调用第三方库线程的中断,但正如您所提到的,不能保证callThirdPartyMethod() 会监听中断。你可以打电话给stop(),但这里是deprecated for good reasons

唯一的添加机制是关闭第三方库正在使用的东西。也许套接字或其他连接可能会从库下关闭。

如果没有办法做到这一点,那么 thread.stop() 是你唯一(不幸的)选择,除非你能获得图书馆的源头。

否则你就是 SOL。

【讨论】:

  • 我正在使用 Java 7,所以我猜不能分叉,因为这是在 Java 8 中添加的(如果我错了,请纠正我)。我主要关心的是线程停止或中断。我设法写了一个计时器。甚至我认为除了使用 stop() 之外别无他法。
  • 对不起@dnup1092,我的意思是创建中的fork。我已经改变了答案。我认为您对stop() 的看法是正确的。只需阅读有关它为什么不好的文档,也许它不会影响您。
  • finally 块不会被 Thread.stop() 违反。我相信,对损坏的对象被解锁以供其他线程访问不一致状态的担忧有点被夸大了。任何RuntimeException 都可以产生相同的效果。
  • @Gray 没问题的朋友。我通过使用 stop() 进行了检查,它导致我的会话中断。我认为没有出路。我认为 JCP 可以研究一下这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多