我在我的线程中使用第三方库,涉及一些繁重的数据库操作。 有时由于数据库上的锁定或任何其他原因导致执行线程卡住。我想杀死线程,不管它在特定时间间隔后做了什么。 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()
答案 0 :(得分:1)
使用FutureTask
包裹您的数据库访问权限并使用FutureTask.get(long, TimeUnit)
获取结果(它将在提供的时间之前返回,或者抛出TimeoutException
)。
阅读Brian Goetz等人的Java Concurrency in Practice第6章了解更多信息
答案 1 :(得分:0)
如果你使用的库是那个代理(它不处理中断或停止标志),那么你就做不了多少。实际上你不能做任何事,除非Thread.stop 。
您可能想要使用它,但是,特别是因为我们讨论的是数据库,它可能并且很可能会使数据库处于非常不一致的状态。你可能甚至没有注意到它,它可能会在10年内弹出。
我的建议是:修复您使用的库,或让某人修复它或冒风险并停止线程(杀死它)并面对后果。