使用繁重的数据库操作停止Java线程

时间:2013-04-30 08:52:14

标签: java multithreading deprecated interrupt

我在我的线程中使用第三方库,涉及一些繁重的数据库操作。 有时由于数据库上的锁定或任何其他原因导致执行线程卡住。我想杀死线程,不管它在特定时间间隔后做了什么。 Thread.interrupt()对我来说不起作用,因为我的线程大部分时间花在我无法修改的第三方库中,并且库不会抛出任何我可以在我的代码中处理的中断异常。 建议不要使用Thread.stop(),因为它已被弃用。 但无论如何我必须杀死线程

void mainThread()
{
  Thread1 t1 = new Thread1();
  t1.start();
  Thread.sleep(time);
  if(t1.getState() != State.TERMINATED)
  {
    // code for killing the thread
  }
}

Thread1()
{
    //doing heavy DB operations using third party Library
}

欢迎任何其他设计的建议。  是否有任何替代方法来杀死线程而不是thread.stop()

2 个答案:

答案 0 :(得分:1)

使用FutureTask包裹您的数据库访问权限并使用FutureTask.get(long, TimeUnit)获取结果(它将在提供的时间之前返回,或者抛出TimeoutException)。

阅读Brian Goetz等人的Java Concurrency in Practice第6章了解更多信息

答案 1 :(得分:0)

如果你使用的库是那个代理(它不处理中断或停止标志),那么你就做不了多少。实际上你不能做任何事,除非Thread.stop

您可能想要使用它,但是,特别是因为我们讨论的是数据库,它可能并且很可能会使数据库处于非常不一致的状态。你可能甚至没有注意到它,它可能会在10年内弹出。

我的建议是:修复您使用的库,或让某人修复它或冒风险并停止线程(杀死它)并面对后果。