Как отменить чтение ввода с консоли?

Итак, я пытаюсь создать консольное приложение, которое налагает на пользователя ограничение по времени. Ожидается, что пользователь введет определенное число, но через определенное количество мил (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», но программа не завершается. Кажется, он все еще ожидает ввода от пользователя. Что я сделал не так? Или есть лучший способ сделать это?


person garbagecollector    schedule 02.04.2012    source источник
comment
Был задан вопрос и получен ответ: stackoverflow.com/questions/804951/   -  person Eugene Retunsky    schedule 03.04.2012
comment
Вы пытались сбросить стеки потоков? kill -QUIT или jconsole могут показать вам их. Как отмечает @evanwong, вы не застряли там, где вы думаете. Вы можете увидеть, какие пользовательские потоки не являются демоном, что может быть проблемой.   -  person Gray    schedule 03.04.2012


Ответы (1)


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

new Timer(true).schedule(task, 10000);
person evanwong    schedule 02.04.2012
comment
Это оно. Я пропустил эту часть в javadoc Timer. Спасибо! - person garbagecollector; 03.04.2012