我通常使用无限循环,如下所示:
public static boolean start = false;
while(!start) {
doMyLogic();
}
但是一位朋友说你需要在while-true循环中稍微延迟(如下),否则它可能会导致内存问题而且这也不是一个好习惯。
建议方式:
while(!start) {
Thread.sleep(few_miliseconds); // 500 ms
doMyLogic();
}
请告诉我建议方式的影响。我做得对吗?
答案 0 :(得分:3)
我会使用ScheduledExecutorService
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
doMyLogic();
}
}, 500, 500, TimeUnit.MILLISECONDS);
此服务可以重复用于许多重复或延迟的任务,并且可以根据需要shutdown()
。
答案 1 :(得分:2)
不是内存问题,但是你阻止了CPU。绝对使用延迟。
它还取决于doMyLogic()
方法。
答案 2 :(得分:2)
在(半)无限循环中插入sleep是一个好习惯,所以当代码执行到达睡眠状态时,其他线程也可以执行。
答案 3 :(得分:2)
如果你没有暂停,你的CPU会不断做一些事情。您实际上阻止了CPU。但是,如果你添加一个暂停(sleep()),你可以让CPU休息一下来做其他事情。
答案 4 :(得分:2)
好吧,我不认为它会有内存问题(除非你的doMyLogic方法有内存问题),因为任何内存泄漏都会表现出来,无论延迟如何。睡眠的真正好处在于,在大多数情况下,代码不需要像计算机那样快速地执行doMyLogic。例如,假设doMyLogic正在检查文件是否在目录中创建。没有必要让计算机每秒检查数百次(这需要大量的CPU和磁盘I / O),而每秒1次就足够了。
没有时间的最大影响是使用额外的CPU时间和逻辑功能所具有的其他资源,在大多数情况下对最终用户没有明显的影响。