2011-02-26 106 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