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

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

相关推荐
岁忧8 分钟前
(nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
java·c++·算法·leetcode·go·散列表
我要成为c嘎嘎大王18 分钟前
【C++】类和对象(2)
开发语言·c++
阿华的代码王国21 分钟前
【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
android·xml·java·前端·后端
码农BookSea25 分钟前
自研 DSL 神器:万字拆解 ANTLR 4 核心原理与高级应用
java·后端
lovebugs28 分钟前
Java并发编程:深入理解volatile与指令重排
java·后端·面试
慕y27433 分钟前
Java学习第九十一部分——OkHttp
java·开发语言·学习
caisexi34 分钟前
Windows批量启动java服务bat脚本
java·windows·python
NullPointerExpection41 分钟前
win10 环境删除文件提示文件被使用无法删除怎么办?
java·ide·windows·win10
Techie峰1 小时前
【Java23种设计模式】:模板方法模式
java·设计模式·模板方法模式
海奥华21 小时前
操作系统到 Go 运行时的内存管理演进与实现
开发语言·后端·golang