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来简单地退出。在搜索之后,我使用了一个关闭钩子取得了部分成功,但它并没有干净利落地工作。
对于注释的行,程序似乎在退出之前循环了很多次(这是主线程只是循环自身吗?)并且注释我在下一行尝试读取输入流时得到异常。
实现这一目标的最佳方式是什么?
答案 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