2012-04-02 12 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 –

+0

スレッドスタックをダンプしようとしましたか? 'kill -QUIT'またはjconsoleがそれらを表示するかもしれません。 @evanwongが指摘しているように、あなたはあなたがどこにいると思うかは分からない。どのユーザースレッドがデーモンではないのかが分かります。 – Gray

答えて

1

タイマーがデーモンスレッドではありません、それはあなたがtimer.cancel(呼び出さない限り、それ自体を終了する)、または、このようにタイマーを作成しません。

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

これはそれです。私はTimerのjavadocでその部分を見逃していました。ありがとう! – garbagecollector

関連する問題