1

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

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

4

2 回答 2

3

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

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

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

编辑:

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

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

编辑2:

这是一个使用关闭钩子工作的最小实现(从命令行开始,然后按ctrlc结束并运行计算代码):

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"
}
于 2012-04-18T01:13:10.453 回答
0

你能不能用 daemon true 启动一个线程,然后在 System.input 中读取一行,然后中断线程。java.util.Timer也是可能的。

于 2012-04-18T01:36:17.037 回答