我通过ExecutorService使用ThreadPool。通过调用shutDownNow(),它会中断池中所有正在运行的线程。当发生这种情况时,我希望这些线程放弃它们的资源(套接字和数据库连接)并简单地死掉,但不再继续运行逻辑,例如:在数据库中插入任何东西。实现这一目标的最简单方法是什么?贝娄是一些示例代码:
编辑:忘了提及我的所有连接都是通过finally
发布的。我只需要确保达到它不会以可靠的方式调用各种数据库插入。
public void threadTest() {
Thread t = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(999999);
} catch (InterruptedException e) {
//invoke thread suicide logic here
}
}
});
t.start();
t.interrupt();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
}
答案 0 :(得分:2)
在我看来,执行此操作的规范方法是永远不会捕获 InterruptedException。
无论如何,你总是应该在finally
块中释放你的资源 - 所以我们假设你是。在这种情况下,您需要做的就是让InterruptedException冒泡到顶层(即在所有方法的throws
子句中声明它)并且瞧!
有些人可能会为所有方法添加一个已检查的异常。但是,这在概念上是正确的 - 声明抛出InterruptedException
的方法表示它是一种阻塞方法。通常情况下,只有低级方法才会实现这一点,因为更高级别的方法很少明确涉及阻塞(即,可能会提出合理的替代实现/遵循不需要它的替代依赖)。
真正值得怀疑的是,你希望你的代码能够像这样“停止”。你没有真的让上下文无条件地从线程管理器做这样的事情,线程中运行的代码需要与你的努力合作。因此,让中断的异常泡沫成为一种方法;另一个可能是捕获相对较低的异常并设置一个布尔stop
标志,您可以在更高级别的代码中进行轮询。
在任何情况下,这里的问题仅仅是如何让更高级别的代码知道它应该在这种情况下终止。如果您正在关闭finally
块中的资源,那么您应该知道它们将始终被适当地释放,而不管其他什么。
答案 1 :(得分:1)
请注意,调用t.interrupt()并抛出InterruptedException对于不可中断的阻塞无效(例如,等待监视器被释放或等待IO操作的线程)。
在这些情况下,您必须使用显式的java.util.concurrent.locks.Lock(可中断)而不是synchronized块和java.nio而不是java.io
答案 2 :(得分:0)
当线程完成其run方法时,它将自动死亡。所以,实际上,什么都不做:
public void threadTest() {
Thread t = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(999999);
} catch (InterruptedException e) {
//invoke thread suicide logic here
// Do nothing so the thread will die
}
}
});
t.start();
t.interrupt();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
}
当threadTest()结束时,线程将从内存中释放,因为线程变量将不再被引用。