12

我读过一些线程说在循环中调用 Thread.sleep() 是有问题的,并且是一个严重的性能问题。但在某些情况下,这似乎是最自然的事情。

例如,如果我希望我的应用程序每3 分钟执行一次(假设它是自动保存

public void startAutosaveLoop(){
    stop = false;
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (!stop){
                Thread.sleep(T*1000);
                if (!stop){
                    // do something
                }
            }
        }
    }).start();
}

有没有更好的方法来做到这一点?这种情况有问题吗?

4

2 回答 2

5

如果你睡了很长时间,它不会影响性能。如果你睡了 5 毫秒,检查一些条件,再睡 5 毫秒等 3 分钟,这将有一些性能成本。

如果您需要每 3 分钟执行一次操作,那么使用调度程序会更有意义。

您可以查看ScheduledExecutorService 的 javadoc以获得非常相似的示例。

于 2013-01-28T11:50:27.347 回答
3

如果要延迟,最好使用ScheduledExecutorService 。该接口支持未来和/或定期执行任务。

请检查 API 文档以获取示例代码和详细信息: http: //docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html

于 2013-01-28T11:51:22.023 回答