Java控制台程序与CTRL-C

Java控制台程序与CTRL-C,java,command-line-interface,exit,Java,Command Line Interface,Exit,我有一个简单的控制台程序,我正在尝试实现Ctrl-C来简单地退出。在一次搜索之后,我使用了一个关闭的钩子,取得了部分成功,但是它并没有很好地工作 在注释行中,程序在退出之前似乎循环了很多次(这是主线程本身循环吗?) 实现这一点的最佳方法是什么?你需要做做点什么来停止循环。 添加private static volatile boolean running=true到类,将while(true)更改为while(running)然后让关机挂钩设置running=false并检查结果。 Volati

我有一个简单的控制台程序,我正在尝试实现Ctrl-C来简单地退出。在一次搜索之后,我使用了一个关闭的钩子,取得了部分成功,但是它并没有很好地工作

在注释行中,程序在退出之前似乎循环了很多次(这是主线程本身循环吗?)


实现这一点的最佳方法是什么?

你需要做做点什么来停止循环。 添加
private static volatile boolean running=true
到类,将
while(true)
更改为
while(running)
然后让关机挂钩设置
running=false并检查结果。
Volatile将确保您的应用程序在多个处理器和/或内核下运行时仍能立即关闭

[编辑]

问题是扫描器阻塞(很抱歉我第一次错过了),这需要您中断主线程

import java.util.Scanner;

public class test {
    public static void main(String[] args) {

        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                System.out.println("Shutdown.");
            }
        });

        String input ="";
        Scanner in = new Scanner(System.in);

        while(true) {
            System.out.print("> ");
//          if (in.hasNext())
                input = in.nextLine();

            if (input.equalsIgnoreCase(""))
                continue;
        }
    }
}

您可能想考虑使用java的控制台:我也无法用未注释的行复制错误。这个代码对我来说是有效的:在运行关闭钩子之后,我点击了CTRL C和VM退出。您确定正确理解了关机挂钩吗?它们在虚拟机开始关机后运行,即在虚拟机收到通过按Ctrl-C生成的操作系统信号后运行。它们不应用于启动关机;相反,它们用于清理资源,即使您的程序没有正常终止。我将澄清运行的
变量是类变量,而不是
main
方法。如果您尝试向方法添加
静态
变量,您应该会得到一个错误,但这只是为了确保。尝试了此建议。恐怕它也会产生同样的效果。当VM被Ctrl-C杀死时,您不需要做任何事情来终止循环。虚拟机将很高兴地终止于活动用户线程。在这种情况下,中断可能没有效果,因为一旦关闭挂钩完成,VM就可以终止“中断”将立即返回,因此VM可以立即终止,并且可能不会麻烦将上下文切换回“主线程”。关于优雅地终止线程,您的想法是正确的;只是不要使用关机挂钩来完成。
private static Thread mainThread;
public static void main(String[] args)
{
    mainThread = Thread.currentThread();

    Runtime.getRuntime().addShutdownHook(new Thread()
    {
        public void run()
        {
            Test.mainThread.interrupt();
        }
    });
    ... // etc