Java控制台程序和CTRL-C

时间:2011-02-26 01:25:33

标签: java command-line-interface exit

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;
        }
    }
}

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

对于注释的行,程序似乎在退出之前循环了很多次(这是主线程只是循环自身吗?)并且注释我在下一行尝试读取输入流时得到异常。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:3)

你需要做做点什么来停止循环。 将private static volatile boolean running = true;添加到班级,将while(true)更改为while(running),然后获取关闭挂钩以设置running=false;并检查结果。 易失性将确保您的应用程序在多个进程和/或核心下运行时仍然会立即关闭。

[编辑]

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

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