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