在 java 中模拟倒计时最有效的方法是什么?

What is the most efficient way to simulate a countdown in java?

我想每秒打印到控制台。到目前为止,我已经想到了两种方法。

long start_time = System.currentTimeMillis();

    while(true){
        if ((System.currentTimeMillis()  - start_time) >= 1000) {
            System.out.println("One second passed");
            start_time = System.currentTimeMillis();
        }
    }

还有这个

   while(true){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("One second passed");
        }
    

有没有比另一种方法更安全、更可靠或更有效的方法? 或者每个都有用例? 谢谢

这并不像看起来那么简单。

你的解决方案的问题是第一个非常低效,第二个容易漂移,因为 sleep(1000) 不能保证正好休眠 1 秒。 (javadoc 说 sleep(1000) 睡眠 至少 一秒钟。)

一种可能性是使用 ScheduledExecutorService.scheduleWithFixedDelay 并通过查看毫秒时钟与您的开始时间(或结束时间)之间的差异来计算每次延迟。这将使您的消息与实时同步(或多或少)。

或者您可以使用 scheduleAtFixedRate 简化它,因为看起来 ScheduledThreadPoolExecutor 会解决时钟同步问题。

另一种可能性是在 Java.

中寻找实现“cron-like”调度程序的第 3 方库