5

我通常使用无限循环,如下所示:

public static boolean start = false;

while(!start) {
    doMyLogic();
}

但是一位朋友说您需要在 while-true 循环内有一个小的延迟(如下所示),否则可能会导致内存问题,这也不是一个好习惯。

建议方式:

while(!start) { 
    Thread.sleep(few_miliseconds);  // 500 ms
    doMyLogic();
}

请告诉我建议方式的影响。我做对了吗?

4

5 回答 5

3

我会使用 ScheduledExecutorService

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        doMyLogic();
    }
}, 500, 500, TimeUnit.MILLISECONDS);

该服务可以重复用于许多重复或延迟的任务,并且可以shutdown()根据需要进行。

于 2012-10-26T14:41:41.683 回答
2

不是内存问题,而是您阻塞了 CPU。绝对使用延迟。

这也取决于doMyLogic()方法。

于 2012-10-26T14:22:05.227 回答
2

在(半)无限循环中插入睡眠总是一个好习惯,这样当代码执行到睡眠时,其他线程也可以执行。

于 2012-10-26T14:22:07.747 回答
2

如果你没有暂停,你的 CPU 就一直在做某事。您实际上是在阻塞 CPU。然而,如果你添加一个暂停 (sleep()),你就会让 CPU 休息一下来做其他事情。

于 2012-10-26T14:23:19.917 回答
2

好吧,我认为它不会有内存问题(除非您的 doMyLogic 方法有内存问题),因为无论延迟如何,任何内存泄漏都会表现出来。睡眠的真正好处是,在大多数情况下,代码不需要像计算机一样快地执行 doMyLogic。例如,假设 doMyLogic 正在检查是否在目录中创建了文件。对于这种情况,没有必要让计算机每秒检查数百次(这将需要大量 CPU 和磁盘 I/O),而每秒 1 次可能就足够了。

没有计时的最大影响是使用额外的 CPU 时间和逻辑功能拥有的其他资源,在大多数情况下,对最终用户没有明显的影响。

于 2012-10-26T14:24:01.940 回答