Java:允许子线程在 InterruptedException 上自行终止?

标签 java multithreading

我正在通过 ExecutorService 使用线程池。通过调用 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) {
    }
}

最佳答案

在我看来,执行此操作的规范方法包括根本不捕获 InterruptedException。

无论如何,您应该总是在 finally block 中释放您的资源,不管这个问题 - 所以让我们假设您是。在这种情况下,您需要做的就是让 InterruptedException 冒泡到顶层(即在所有方法的 throws 子句中声明它),瞧!

有些人可能不愿意向所有方法添加检查异常。但是,这在概念上是正确的 - 声明为抛出 InterruptedException 的方法表示它是一个阻塞方法。通常,只有低级方法会实现这一点,因为更高级别的方法很少会明确涉及阻塞(即可以提出一个合理的替代实现/推迟到不需要它的替代依赖项)。

真正值得怀疑的是您希望您的代码像这样“停止”。您真的没有从线程管理器无条件地执行此类操作的上下文,线程中运行的代码需要配合您的工作。所以让中断的异常冒泡是一种方法;另一个可能是在相对较低的位置捕获此异常并设置一个 boolean 值 stop 标志,您可以在更高级别的代码中轮询该标志。

无论如何,这里的问题完全是关于如何让更高级别的代码知道它应该在这种情况下终止。如果您在 finally block 中关闭资源(正如您应该做的那样),那么您就会知道无论其他情况如何,它们总是会被适本地释放。

关于Java:允许子线程在 InterruptedException 上自行终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2645652/

相关文章:

java - Maven 本地 Artifact 解析在 1 天后不起作用

java - 使用什么 SimpleDateFormat 模式?

AutoResetEvent 的 C# 线程问题

Java:锁定线程时,AtomicBoolean 和静态 boolean 变量有什么区别?

java - Ehcache 设置为永恒但无论如何都会忘记元素?

java - 无法读取使用 DataOutputStream 发送的号码

Java正则表达式无法找到 "Ts"后跟 "kb"

python - Flask + uwsgi + 线程

c++ - 为什么 std::thread 缺少基本功能?

c - FD_SET、FD_CLR ...是原子操作吗?