2011-02-26 109 views
0
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来简单地退出。搜索后,我已经使用关闭挂钩取得了部分成功,但它不能干净地工作。Java控制台程序和CTRL-C

随着线条的注释,程序似乎在退出前循环了好几次(这是主线程只是循环自己的?),并且在下一行尝试读取输入流的注释中出现异常。

实现这个目标的最佳方法是什么?

+0

你可能要考虑使用Java的控制台:http://download.oracle.com/javase/6/docs/api/java/io/Console.html – ranman 2011-02-26 01:31:25

+0

还有我无法复制你的错误与线未注释。 – ranman 2011-02-26 01:38:10

+0

此代码适用于我:我按Ctrl-C并在运行关机挂钩后退出VM。你确定你已经正确理解关闭挂钩吗?它们在虚拟机开始关闭之后运行,即它在接收到通过按下Ctrl-C生成的操作系统信号之后运行。他们不是你应该用来启动关机的东西;相反,即使您的程序没有正常终止,它们也可以清理资源。 – 2011-02-26 04:11:23

回答

2

你需要做做些什么来停止循环。 将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 
+0

我会澄清一下,'running'变量是一个Class变量,__does不是___在'main'方法中。如果您尝试将“静态”变量添加到某个方法中,您应该会得到一个错误,但只是为了确保。 – 2011-02-26 01:41:33

+0

试过这个建议。它产生了我害怕的相同效果。 – tim 2011-02-26 01:55:04

+0

编辑添加'中断()' – 2011-02-26 02:37:23