在 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() {
@Override
public 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
⚠️ 注意:所有延时方法的时间精度受操作系统调度影响,不保证完全精确。