这听起来像是以前被问过的,但它与规范有点不同。我不想要典型的(用户运行程序后,我希望它问“你想再去一次吗?”)。我想启动一个进程(通过键入我已经完成的某个字符串)并让它运行无限时间,直到用户停止它。没有办法知道它会运行多长时间。这个程序恰好是一个计时器。所以我需要它来计算它运行了多长时间,能够在任何给定时刻被用户停止,并打印出它运行了多长时间。
截至目前,我没有使用任何 UI/GUI。保持尽可能简单。
这听起来像是以前被问过的,但它与规范有点不同。我不想要典型的(用户运行程序后,我希望它问“你想再去一次吗?”)。我想启动一个进程(通过键入我已经完成的某个字符串)并让它运行无限时间,直到用户停止它。没有办法知道它会运行多长时间。这个程序恰好是一个计时器。所以我需要它来计算它运行了多长时间,能够在任何给定时刻被用户停止,并打印出它运行了多长时间。
截至目前,我没有使用任何 UI/GUI。保持尽可能简单。
设置关闭挂钩(JVM 停止时运行的代码):
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
// print stuff here
}
}));
让用户ctrlc在命令行中键入以停止执行 - 当 JVM 关闭时,您的钩子将运行以打印您喜欢的内容。
以上是残酷但简单的,但是如果您不想终止整个 JVM,那么您将进入“服务器事件”的领域来驱动行为,这可以采取多种形式来引发动作:
这是一个使用关闭钩子工作的最小实现(从命令行开始,然后按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"
}
你能不能用 daemon true 启动一个线程,然后在 System.input 中读取一行,然后中断线程。java.util.Timer
也是可能的。