是否可以在Java循环中使用Thread.sleep()来定期执行某些操作?

时间:2013-01-28 11:46:06

标签: java multithreading loops intervals thread-sleep

我已经读过一些线程,说在循环中调用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();
}

有更好的方法吗?这种情况有问题吗?

2 个答案:

答案 0 :(得分:5)

如果长时间睡眠,不会影响性能。如果你睡了5ms,检查一些情况,回到睡眠状态5毫秒等等3分钟会有一些性能成本。

如果您需要的是每隔3分钟做一些事情,那么使用调度程序会更有意义。

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

答案 1 :(得分:3)

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

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