gpt4 book ai didi

java - 收到信号时正常关闭应用程序

转载 作者:行者123 更新时间:2023-12-02 10:40:22 25 4
gpt4 key购买 nike

我正在考虑如何编写一个信号处理程序来通知主线程需要退出。

我的想法是:

1)使用以下代码拦截信号

SignalHandler handler = new SignalHandler () {
public void handle(Signal sig) {
System.out.println("Signal " + sig);
System.out.println("Shutting down...");

ServiceLocator.ProgramState().setMustExit();

System.exit(0);
}
};
Signal.handle(new Signal("INT"), handler);
Signal.handle(new Signal("TERM"), handler);

2)设置一个ProgramState对象来指示是否需要退出:ServiceLocator.ProgramState().setMustExit();

3) 将以下代码放入程序的某些部分,以检查 ProgramState 是否告诉我退出:

if (ServiceLocator.ProgramState().mustExit()) {
throw new MustExitException();
}

该异常将被主线程拦截并干净地退出。

我不太喜欢像我要做的那样抛出异常,但这似乎是实现我的目标的快速方法。

还有其他方法可以优雅退出吗?

最佳答案

主线程通常会等待一些事件/通知(直接或间接),以防止它立即终止程序

干净的关闭将让主线程知道是时候通过中断它或通知它来“继续”。作为结束该点之后程序执行的路径的一部分,它应该负责“终止”程序的其他关键部分(在大多数情况下,没有任何)。

如果应用程序是单线程的......那么它可能不应该是。核心执行逻辑应与主线程分离。

Spring IOC/Guice(Netflix 管理器)的存在特别是为了对对象图实现更好的生命周期控制。

两者都可以帮助您构建一个实现,其中引导/关闭/组件连接与应用程序的实际逻辑分离,并提供管理各种对象/类的生命周期的便捷方法。

我衷心建议您使用它们,而不是滚动自己的关闭机制。 (当然,保留信号处理功能,但也应该与主线程分离)。你最终会得到一个类似毒丸的机制。

例如 - 如果您选择使用 Spring,您将把信号处理程序定义为一个 bean,并使用 ConfigurableApplicationContext 注入(inject)/ Autowiring 它。实例,并调用其 close()接收到所需信号后的方法。这将导致所有 Spring 有线 bean 执行其定义的(如果定义的)关闭/销毁行为

附注信号处理将起作用,但有更具体的方法可以从外部源传送关闭消息(请参阅 ZeroMq/JeroMQ,了解无代理消息示例)。

关于java - 收到信号时正常关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52957622/

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