【发布时间】: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
}
我遵循的停止/中断它的方法
- 我写了一个 TimerTask 检查线程是 超过时间限制并在它们上调用中断()(但它 他们继续执行时似乎什么也没发生)。
- 我将 TimerTask 的代码从中断它更改为调用 线程上的 stop()。这可行,但会引发 ThreadDeath 错误。 此外,我在大多数博客甚至 stackoverflow 中读到的内容是 我们永远不应该调用 stop 方法。
【问题讨论】:
-
一个设计良好的第三方库应该能正确处理中断信号。也许您应该考虑选择另一个库。
-
你可以试试这个方法:stackoverflow.com/questions/6859681/…
-
@waltersu 无法更改库。
-
@apruden 这种方法对我不起作用
-
调用 thread.stop 是个坏主意。它可能工作正常,或者它可能会破坏数据结构,以至于所有未来的请求都返回不正确的数据。这就是该函数被弃用的原因——因为一个线程不能被外部源安全地停止。除非您打算立即重新启动应用程序,否则永远不要相信停止。
标签: java spring multithreading thread-safety