如何停止java应用程序?

Yat*_*oel 4 java

我已经创建了一个java应用程序并将其打包到一个可执行的jar文件中.现在,用户可以通过以下两种方式之一启动该程序:

  1. 通过在命令提示符下执行以下命令从命令提示符启动:

    java -jar"MyJar.jar"

  2. 通过双击该jar文件.

我希望我的客户采用第二种方法,因为它比第一种方法容易得多.但第二种方法的问题是如何在应用程序完成之前停止它?

它是一个命令行应用程序.

当用户双击jar文件时,不会出现命令提示符窗口.那么在这种情况下,Ctrl + c会工作吗?

Niv*_*vas 11

停止(退出)应用程序应该在应用程序内部.无论是基于命令行或图形用户界面,应用程序开发人员应该写代码退出它(对于例如,在一个命令行应用程序,你可能有一些像Press 5 to exit,Press Esc to Exit等),并与GUI的应用程序,你将不得不写代码窗口关闭时退出,或EXIT按钮(或其他,取决于您的应用程序)

Ctrl + C是杀死申请.这不是正常退出.对于具有GUI的应用程序,用户通常(在Windows中)转到任务管理器并结束该过程(在其他操作系统中类似的方式)

但这些是异常退出 - 当用户想要杀死应用程序时,例如,应用程序不再响应.正常退出应该由应用程序提供(因此程序员 - 你)


O. *_*nes 5

我有类似的问题.我有一些Java程序基本上是长期运行的守护程序进程.很高兴能够阻止它们并反弹(重启)它们.

我用了两种方法.两者都有优点和缺点.一种是设置一个信号处理程序,通过在你的程序的某个类中放置这样的函数(在我的程序中,它使用main方法).

import sun.misc.Signal;
import sun.misc.SignalHandler;
...
  private static boolean stopNow = false;
  private static boolean restartNow = false;
...
      private static void handleSignals() {
    try {

        Signal.handle(new Signal("TERM"), new SignalHandler() {
            // Signal handler method for CTRL-C and simple kill command.
            public void handle(Signal signal) {
                MyClass.stopNow = true;
            }
        });
    }
    catch (final IllegalArgumentException e) {
        logger.warn("No SIGTERM handling in this instance.");
    }
    try {
        Signal.handle(new Signal("INT"), new SignalHandler() {
            // Signal handler method for kill -INT command
            public void handle(Signal signal) {
                MyClass.stopNow = true;
            }
        });
    }
    catch (final IllegalArgumentException e) {
        logger.debug("No SIGINT handling in this instance.");
    }
    try {

        Signal.handle(new Signal("HUP"), new SignalHandler() {
            // Signal handler method for kill -HUP command
            public void handle(Signal signal) {
                MyClass.restartNow = true;
            }
        });
    }
    catch (final IllegalArgumentException e) {
        logger.warn("No SIGHUP handling in this instance.");
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我们的生产起到了很好的作用.你需要一个真正的Sun JRE才能工作; 一个典型的Linux发行版附带的那个没有Signal信号.它在Windows上运行正常,但是你没有得到HUP信号.你确实需要一个快捷方式或一个shellcript来启动这个东西.

另外,请记住,信号处理是一个很大的问题.不要试图在信号处理程序中做很多事情.您可以看到我的示例代码只是设置静态标志.程序的其他部分检测到标志已更改,然后关闭.我本可以在信号处理程序中尝试更复杂的代码,但我不想承担QA负担.

另一种方法是将程序构建为Servlet.在这种情况下,您将编写一个扩展HttpServlet的类.使用启动工作线程的方法覆盖Servlet.init.同样,使用一种关闭自己的方法覆盖Servlet.destroy.

然后,您可以使用像Tomcat这样的Java EE容器服务器来管理启动和停止.