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