如何使用用户输入退出无限循环?

时间:2012-04-18 01:08:49

标签: java

这可能听起来像之前被问过,但它与常规有点不同。我不想要典型的(在用户运行程序之后,我想让它问“你想再去一次吗?”)。我想开始一个过程(通过键入我已经完成的某个字符串)并让它运行无限长的时间,直到用户停止它。没有办法知道它将运行多久。这个程序恰好是一个计时器。所以我需要它来计算它运行了多长时间,能够在任何给定时刻被用户停止,并打印出它运行了多长时间。

截至目前,我没有使用任何UI / GUI。保持尽可能简单。

2 个答案:

答案 0 :(得分:3)

设置关闭挂钩(在JVM暂停时运行的代码):

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    @Override
    public void run() {
        // print stuff here
    }
}));

让用户在命令行键入 ctrl c 以暂停执行 - 当JVM关闭时,您的钩子将运行以打印您喜欢的内容。

编辑:

以上是残酷而简单的,但是如果你不想终止整个JVM,那么你就会进入“服务器事件”领域来驱动行为,这可能会采取多种形式来引发行动: / p>

  • 在一个单独的线程中运行你的工作任务,并等待终端上的一个命令停止(或其他动作)该线程 - 这是我首先尝试的,这对你来说非常有教育意义。这样做
  • 监视文件系统,查找是否存在文件(跛脚,但它使用最少的代码)
  • 监听端口的消息,Web服务器的HTTP端口通常是首选武器,但我们在服务器端开始变得更重了
  • 监视JMS队列中的消息 - 我们现在处于Java EE空间,但仍然更加沉重
  • 您希望实施的任何其他“州改变”

编辑2:

这是一个使用关闭钩子的最小实现(在命令行上启动并按 ctrl c 结束并运行计算代码):

public static void main(String[] args) throws Exception {
    final long start = System.currentTimeMillis();
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {
            double hours = (System.currentTimeMillis() - start) / 3600000d;
            System.out.println("Please enter the hourly rate");
            double hourlyRate = new Scanner(System.in).nextDouble();
            System.out.format("Program ran for %01.3f hours and cost $%02.2f", hours, hourlyRate * hours);
        }
    }));
    Thread.sleep(Long.MAX_VALUE); // Sleep "forever"
}

答案 1 :(得分:0)

你可以用守护进程启动一个Thread,然后在System.input中读取一行,然后中断该线程。 java.util.Timer也是可能的。