我正在开发一个永远运行的Java程序,但我不知道如何在不使用“try catch”的情况下将每个循环延迟一秒钟。我试过了
import java.util.concurrent.TimeUnit;
public class program {
public static void main(String[] args) {
TimeUnit wait = new TimeUnit();
while (true) {
wait.SECONDS.sleep(1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。谁能帮我?
经过一段时间的考虑后,我确实同意 Thread.sleep 显然是使主线程陷入循环的直接方法。
不过,在其他用例中可能会有所不同,因为它会阻止一个可以同时执行其他操作的线程。如果您有兴趣,这里讨论了 Timer 与 Thread.sleep,这里还有一个不太全面的答案,可以作为重复的问题传递。
public static void sleep(int someDelay) {
try {
Thread.sleep(someDelay);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Run Code Online (Sandbox Code Playgroud)
对于要求更高的场景,ScheduledThreadPoolExecutor它是您的朋友。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
executor.schedule(() -> {
// doSmthg
}, 12, TimeUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)
另一种方法是 Timer/Timertask,现在通常不鼓励使用它(感谢 @rkosegi 指出这一点),而支持 ScheduledThreadPoolExecutor。池大小 1 模仿 Timer/Timertask 功能。
另一方面,Timer/Timertask 在单线程场景中处理大量小任务时具有优势“实现说明:此类可扩展到大量并发计划任务(数千个应该没有问题)。在内部,它使用二进制heap 来表示它的任务队列,因此调度一个任务的成本是 O(log n),其中 n 是并发调度任务的数量。 ”,其中 ScheduledExecutorService 使用了 BlockingQueue。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// do smthg;
}
}, someDelay);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |