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

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

相关推荐
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说12 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜12 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa12 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
一次旅行12 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了13 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品13 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库