2012-04-02 4 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"); 

Это, кажется, работает нормально, за исключением того, что программа зависла в режиме ввода на неопределенный срок. Он выливает «КОНЕЦ» на консоль, но программа не заканчивается. Кажется, он все еще ожидает ввода от пользователя. Что я сделал не так? Или есть лучший способ сделать это?

+0

Это было предложено и ответил: HTTP: // stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout –

+0

Вы пытались сбросить стеки потоков? 'kill -QUIT' или jconsole могут показать вам их. Как отмечает @evanwong, вы не застреваете там, где думаете. Вы можете видеть, какие потоки пользователей не являются демонами, которые могут быть проблемой. – Gray

ответ

1

Таймер не демон поток, он не прекратит себя, если вы звоните timer.cancel() или создать таймер таким образом:

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

Вот оно. Я пропустил эту часть в джавадоке Таймера. Благодаря! – garbagecollector