如何优雅地退出Java应用程序?

时间:2019-01-27 17:24:15

标签: java java-8 interrupt-handling

我有一个Java应用程序,它使用Executors.newSingleThreadScheduledExecutor定期运行某些功能

main()函数中,我一直在等待使用:

Thread.currentThread().join();

java应用程序能否识别它正在关闭(即通过Ctrl-C,Ctrl-D信号),特别是正在运行计划任务的线程?

想法是正常关闭应用程序。

3 个答案:

答案 0 :(得分:3)

在Java运行时中注册shutdown hook。 JVM的关闭将在注册的线程上通知。下面是一个示例:

public class Main {

    public static void main(String[] args) {

        Runtime.getRuntime().addShutdownHook(new ShutDownHookThread());

        while (true) {

        }

    }

}

class ShutDownHookThread extends Thread {
    @Override
    public void run() {
       // ***write your code here to handle any shutdown request
        System.out.println("Shut Down Hook Called");
        super.run();
    }
}

答案 1 :(得分:1)

要正常关闭Executor服务,您需要按照以下步骤进行操作

  1. executorService.shutdownNow();
  2. executorService.awaitTermination();

1,执行程序将尝试中断其管理的线程,并拒绝提交所有新任务。

  1. 等待一段时间终止现有任务

下面是正常执行器关闭的示例

pool.shutdown(); // Disable new tasks from being submitted
try {
    // Wait a while for existing tasks to terminate
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
        pool.shutdownNow(); // Cancel currently executing tasks
        // Wait a while for tasks to respond to being cancelled
        if (!pool.awaitTermination(60, TimeUnit.SECONDS))
            System.err.println("Pool did not terminate");
    }
} catch (InterruptedException ie) {
    // (Re-)Cancel if current thread also interrupted
    pool.shutdownNow();
    // Preserve interrupt status
    Thread.currentThread().interrupt();
}

请找到here完整的详细答案

希望帮助

答案 2 :(得分:1)

添加shutdown hook来处理信号。在处理程序中,使其停止产生期间线程,并加入或强制杀死现有线程。