在 Java 中實現延時操作主要有以下幾種方式,根據使用場景選擇合適的方法:
1.?Thread.sleep()
(最常用)
java
復制
下載
try {// 延時 1000 毫秒(1秒)Thread.sleep(1000); } catch (InterruptedException e) {// 處理中斷異常(通常恢復中斷狀態)Thread.currentThread().interrupt(); }
特點:
-
簡單易用,阻塞當前線程
-
需處理?
InterruptedException
2.?TimeUnit
(推薦,更語義化)
java
復制
下載
import java.util.concurrent.TimeUnit;try {TimeUnit.SECONDS.sleep(1); // 延時 1 秒// 等價于 TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) {Thread.currentThread().interrupt(); }
優點:時間單位更清晰(支持?NANOSECONDS
/MICROSECONDS
/MILLISECONDS
/SECONDS
?等)
3.?ScheduledExecutorService
(異步延時任務)
java
復制
下載
import java.util.concurrent.*;ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 延時 1 秒后執行任務(異步不阻塞主線程) scheduler.schedule(() -> {System.out.println("任務執行"); }, 1, TimeUnit.SECONDS);// 關閉線程池(實際開發中根據業務決定關閉時機) scheduler.shutdown();
適用場景:
-
需要異步執行延時任務
-
避免阻塞主線程
-
支持定時周期性任務
4.?Timer
?類(舊版方案,不推薦新項目使用)
java
復制
下載
Timer timer = new Timer(); timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("延時任務");} }, 1000); // 延時 1 秒
缺點:
-
單線程執行,任務相互影響
-
拋出異常會導致整個 Timer 終止
-
推薦用?
ScheduledExecutorService
?替代
5.?Object.wait(timeout)
(線程同步場景)
java
復制
下載
synchronized (lock) {try {lock.wait(1000); // 釋放鎖并等待 1 秒} catch (InterruptedException e) {Thread.currentThread().interrupt();} }
注意:需在同步塊中使用,會釋放對象鎖。
選擇建議:
-
簡單阻塞當前線程?→ 用?
Thread.sleep()
?或?TimeUnit.sleep()
-
后臺異步延時任務?→ 用?
ScheduledExecutorService
-
線程間協調等待?→ 用?
Object.wait(timeout)
-
避免在新項目中使用?
Timer
?? 注意:所有延時方法的時間精度受操作系統調度影響,不保證完全精確。