在时间限制后停止/中断线程

时间:2016-08-08 01:52:26

标签: java spring multithreading thread-safety

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

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

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

请考虑以下代码段:

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中读到的也是 我们永远不应该叫停止方法。

1 个答案:

答案 0 :(得分:2)

  

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

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

您可以调用中断第三方库线程,但正如您所提到的,无法保证callThirdPartyMethod()将侦听中断。您可以致电stop(),但这是deprecated for good reasons

唯一的补充机制是关闭第三方库正在使用的内容。也许可以从库下面关闭套接字或其他连接。

如果没有办法,那么thread.stop()是你唯一的(不幸的)替代方案,除非你能够找到图书馆的来源。

否则你不幸的是你。