0

我看到一些代码像这样使用 ShutdownHook

Runtime.getRuntime().addShutdownHook(new Thread(){
    ConfigurableApplicationContext.stop();
    //close spring context;
    threadpool.shutdownnow();
    //close theadpool
});

这样做有什么用吗?

我想

当jvm退出时,可能线程会立即关闭,spring上下文也会关闭;</p>

当我们需要调用 System.exit() 时,我们下一步该怎么做?

4

1 回答 1

0

这实际上取决于您的应用程序和对象的生命周期以及您似乎在上下文之外拥有的那些线程。如果您在独立的 java 进程中运行 spring 容器,那么像这样捕获关闭挂钩是一种方法。另一种方法是让它侦听 tcp 端口并发送命令以开始关闭过程。如果你在像 tomcat 这样的 web 容器中运行,那么你应该遵循正常 webapp 关闭的标准,Spring 支持 Context Listeners。

我还会考虑重新设计您的应用程序,以便所有线程都由位于您的 spring 容器中的 bean 管理。例如,使用为启动/停止方法配置了指令(属性)的 bean,然后该 bean 将使用 Executor 进行线程池。这样,你的关闭只是关闭了 Spring 容器,Spring 为有序关闭 bean 提供了很好的支持。这些 bean 之一是您的对象,它在 Executor 中保存线程。它比尝试将 Spring bean 与外部线程集成要干净得多。

希望这可以帮助。

于 2013-10-26T02:45:02.820 回答