You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建延迟s秒执行的Java线程?不阻塞其他进程运行

Java实现延迟执行线程且不阻塞其他操作的方案

没问题!在Java里实现延迟指定秒数后执行的异步线程,同时让其他线程正常运行完全可行,下面给你两种实用的非阻塞方案:

方案1:使用Thread结合Thread.sleep()

这是最基础的实现方式,直接创建独立线程,在其执行逻辑里先休眠指定时长,再执行目标任务。主线程(或其他线程)启动这个延迟线程后,能继续执行自身逻辑,完全不会被阻塞。

示例代码:

public class DelayedThreadExample {
    public static void main(String[] args) {
        // 创建并启动延迟线程,延迟3秒执行
        Thread delayedThread = new Thread(() -> {
            try {
                // 延迟3秒(单位:毫秒)
                Thread.sleep(3000);
                // 延迟后执行的核心任务
                System.out.println("延迟线程:3秒到了,我开始执行啦!");
            } catch (InterruptedException e) {
                // 处理线程中断异常
                Thread.currentThread().interrupt();
                System.out.println("延迟线程被中断了");
            }
        });
        delayedThread.start();

        // 主线程不受影响,继续执行自己的逻辑
        System.out.println("主线程:我先输出点内容");
        System.out.println("主线程:再输出点别的");
        for (int i = 1; i <= 5; i++) {
            try {
                // 模拟主线程的耗时操作,每次休眠500毫秒
                Thread.sleep(500);
                System.out.println("主线程:正在执行第" + i + "个任务");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行后你会看到:主线程持续输出内容,3秒后延迟线程才会打印自己的消息,完全匹配你的需求。

方案2:使用ScheduledExecutorService(推荐)

如果需要更灵活的定时任务管理(比如后续要取消任务、复用线程池等),Java并发包提供的ScheduledExecutorService是更优选择——它专门处理延迟/周期性任务,比手动管理Thread更可靠高效。

示例代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadExample {
    public static void main(String[] args) {
        // 创建单线程调度线程池
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

        // 调度任务:延迟3秒后执行
        scheduler.schedule(() -> {
            System.out.println("调度线程:3秒延迟到了,开始执行任务!");
            // 任务完成后关闭线程池(如果不再使用的话)
            scheduler.shutdown();
        }, 3, TimeUnit.SECONDS);

        // 主线程继续执行自身逻辑
        System.out.println("主线程:启动延迟任务后,我继续干活");
        for (int i = 1; i <= 6; i++) {
            try {
                Thread.sleep(500);
                System.out.println("主线程:当前执行第" + i + "步操作");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

为什么推荐这个方案?

  • 可轻松管理多个定时/延迟任务,无需手动创建大量Thread
  • 支持通过ScheduledFuture对象取消已调度的任务
  • 线程池自动处理线程的创建、复用与销毁,性能更稳定

注意事项

  • Thread.sleep()会抛出InterruptedException,必须处理该异常,避免线程意外终止
  • 使用ScheduledExecutorService时,任务完成后记得调用shutdown()关闭线程池,否则程序可能无法自动退出
  • 延迟计时是从线程启动/调度时开始计算,而非程序启动时间

内容的提问来源于stack exchange,提问作者randomuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:48:13