Java实现延迟执⾏代码
Java实现延迟执⾏代码
对于Java程序在它们的操作中添加延迟或暂停是⽐较常见的。这对于任务暂停直到另外任务完成执⾏场景⽐较有⽤。本⽂我们提供两类⽅法实现延迟执⾏。
1. 基于线程(Thread)⽅法
当Java查询运⾏时,它在操作系统上产⽣⼀个进程,其⾄少包含⼀个线程————主线程负责查询运⾏。⽽且,Java⽀持多线程,程序可以创建新的线程与主线程并⾏或异步执⾏。
1.1. 使⽤Thread.sleep
Java中⼀种快速却不可靠的暂停⽅式是让当前线程休眠⼀定时间。使⽤Thread.sleep(milliseconds)来完成:
try {
Thread.sleep(secondsToSleep * 1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
使⽤try…catch捕获sleep⽅法的异常是很好的实践⽅式。上⾯⽰例捕获InterruptedException并显⽰中断当前线程,为了后续处理。这在多线程程序⾮常重要。
1.2. 使⽤TimeUnit.sleep
使⽤TimeUnit.XXX.sleep(y),可读性更好,其中xxx是休眠的时间单位,如SECONDS, MINUTES等,y是数量。其背后还是使⽤Thread.sleep,请看⽰例:
try {
TimeUnit.SECONDS.sleep(secondsToSleep);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
使⽤基于线程⽅式有⼏个缺点:
休眠时间不精确,特别是当时间增量较⼩时,如毫秒、纳秒。
try catch的使用方法当在循环内部使⽤,休眠在循环迭代之间会稍微漂移,因为其他代码执⾏导致多次迭代后执⾏时间不够精确。
2. 基于ExecutorService⽅法
Java提供了ScheduledExecutorService接⼝是更强⼤、精确的解决⽅案。接⼝可以安排代码在指定的延迟或固定的时间间隔后运⾏⼀次。要在延迟之后运⾏⼀段代码,我们可以使⽤schedule⽅法:
ScheduledExecutorService executorService = wSingleThreadScheduledExecutor();
executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);
Classname::someTask 部分是指定特定⽅法延迟执⾏。
someTask是执⾏⽅法的名称
Classname是包括someTask⽅法的类名称
以固定时间间隔执⾏,可以使⽤scheduleAtFixedRate :
ScheduledExecutorService executorService = wSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);
这会重复调⽤someTask⽅法,每次调⽤后暂停delayInSeconds秒。除了允许更多的计时选项之外,ScheduledExecutorService⽅法还可以产⽣更精确的时间间隔,因为它可以防⽌漂移问题。
3. 总结
本⽂讨论Java程序中两种⽅法实现延迟。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论