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() {
    @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();
    }
}

注意:需在同步块中使用,会释放对象锁。


选择建议:

  1. 简单阻塞当前线程 → 用 Thread.sleep()TimeUnit.sleep()

  2. 后台异步延时任务 → 用 ScheduledExecutorService

  3. 线程间协调等待 → 用 Object.wait(timeout)

  4. 避免在新项目中使用 Timer

⚠️ 注意:所有延时方法的时间精度受操作系统调度影响,不保证完全精确。

相关推荐
饺子大魔王的男人21 分钟前
Remote JVM Debug+cpolar 让 Java 远程调试超丝滑
java·开发语言·jvm
兩尛6 小时前
c++知识点2
开发语言·c++
fengfuyao9857 小时前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck7 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Hx_Ma168 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode8 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢9 小时前
Java集合笔记总结
java·笔记
小酒窝.9 小时前
【多线程】多线程打印ABC
java
lly2024069 小时前
C 语言中的结构体
开发语言
乡野码圣10 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库