2012-04-02 90 views
1

所以我試圖做一個控制檯應用程序,強加給用戶一個時間限制。用戶需要輸入一定的數字,但經過一定的時間(10秒)後,它將跳出該輸入模式,並告訴用戶時間已到,程序繼續運行。這是我的代碼:如何取消控制檯的閱讀輸入?

final InputStreamReader isr = new InputStreamReader(System.in); 
    final BufferedReader br = new BufferedReader(isr); 

    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      try { 
       System.in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 

    new Timer().schedule(task, 10000); 

    try { 
     String line = br.readLine(); 
     if (line == null) { 
      System.out.println("TIME EXPIRED"); 
     } else { 
      System.out.println("TEXT: " + line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("END"); 

它似乎正常工作,除了程序似乎無限期地停留在輸入模式。它向控制檯吐出「END」,但程序不會終止。它似乎仍在期待用戶的輸入。我做錯了什麼?還是有更好的方法來做到這一點?

+0

它已被提問和回答:HTTP:// stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout – 2012-04-02 20:43:56

+0

您是否嘗試轉儲線程堆棧? 'kill -QUIT'或者jconsole可能會讓你看到它們。正如@evanwong指出的那樣,你不會陷入你認爲自己的地方。你可以看到哪些用戶線程不是守護進程,這可能是問題。 – Gray 2012-04-02 21:29:16

回答

1

定時器沒有守護線程,除非你調用timer.cancel(它不會自行終止),或者通過這種方式創建的計時器:

new Timer(true).schedule(task, 10000); 
+0

就是這樣。我錯過了Timer的javadoc中的那部分。謝謝! – garbagecollector 2012-04-03 18:44:26