gpt4 book ai didi

java - 为什么我的 main 方法中的 shutdownhook 没有被调用?

转载 作者:IT王子 更新时间:2023-10-29 06:06:28 25 4
gpt4 key购买 nike

我的主要方法中有以下内容:

public static void main(String[] args) throws IOException {
Properties properties = getConfig();
Jedis jedis = configure(properties)

jedis.subscribe(queueHandler, "queue");

Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
logger.debug("SHUTTING DOWN");
jedis.close();
}
});
}

我注意到我的关闭 Hook 中的代码从未运行过,这是为什么?如何清理我的主要方法占用的资源?

最佳答案

“请注意,订阅是一个阻塞操作……”(来自 the AdvancedUsage wiki)。

这反过来意味着 shutdown-hook 仅在您取消订阅或关闭 Jedis 后才注册,当 JVM 已经关闭时,您可能只会看到那部分代码(在这种情况下,新添加的关闭 Hook 将被忽略:关闭 Hook 必须在 JVM 关闭之前注册)。

“有关更多使用示例,请查看测试。” (来自main Github page)

那么让我们看看PublishSubscribeCommandsTest .
测试只是一个订阅操作,但在订阅操作中,JedisPubSub 会在收到特定消息时自行取消订阅,从而解除阻塞,以便测试可以完成。

您可以尝试两件事:

  • 在调用jedis.subscribe之前注册关闭 Hook
  • 从测试中复制代码并修改它,以便您可以尝试阻塞和解除阻塞线程以及从关闭 Hook 中关闭 Jedis(以清理已用资源)

关于java - 为什么我的 main 方法中的 shutdownhook 没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36369453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com