1

我在我的线程中使用第三方库,其中涉及一些繁重的数据库操作。有时由于数据库上的锁定或任何其他原因线程执行被卡住。我想杀死线程,不管它在特定时间间隔之后做什么。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()

4

2 回答 2

2

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

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

于 2013-04-30T09:40:36.643 回答
0

如果您使用的库是那个代理(它不处理中断或停止标志),那么您将无能为力。实际上你什么也做不了,除非 Thread.stop

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

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

于 2013-04-30T09:26:53.110 回答