【问题标题】:How to cancel out reading input from console?如何取消从控制台读取输入?
【发布时间】:2012-04-02 20:40:05
【问题描述】:

所以我正在尝试制作一个对用户施加时间限制的控制台应用程序。用户应该输入一个特定的数字,但在一定数量的 milis(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”,但程序不会终止。似乎它仍在期待用户的输入。我做错什么了?或者有更好的方法吗?

【问题讨论】:

  • 您是否尝试过转储线程堆栈? kill -QUIT 或 jconsole 可能会向您展示它们。正如@evanwong 指出的那样,您并没有被困在您认为的位置。您可以查看哪些用户线程不是守护进程,这可能是问题所在。

标签: java multithreading timer console system.in


【解决方案1】:

定时器不是守护线程,除非你调用 timer.cancel() 或以这种方式创建定时器,否则它不会自行终止:

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

【讨论】:

  • 就是这样。我错过了 Timer 的 javadoc 中的那部分。谢谢!
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多