讲师中心 微信公众号
AI工具推荐 视频效率加速

Java如何创建定时任务线程_Java ScheduledExecutorService定时执行方案

夏伟大大_4660

夏伟大大_4660

发布时间:2025-11-22 08:43:02

|

691人浏览过

|

来源于php中文网

原创

ScheduledExecutorService是Java中实现定时任务的首选方案,它比Timer更灵活且线程安全。通过Executors.newScheduledThreadPool创建线程池后,可使用scheduleAtFixedRate按固定频率执行任务,或用scheduleWithFixedDelay在任务完成后延迟指定时间再执行;二者区别在于调度时机:前者以固定周期为间隔,后者以上一任务结束为起点。使用时需注意捕获任务异常、合理配置线程池大小,并在程序退出前调用shutdown关闭线程池;对于复杂场景如Cron表达式支持,推荐Quartz或Spring Scheduling。在Spring中结合@Scheduled注解和@EnableScheduling可简化开发。

java如何创建定时任务线程_java scheduledexecutorservice定时执行方案

在Java中实现定时任务,ScheduledExecutorService 是最推荐的方式之一。它属于java.util.concurrent包,相比传统的Timer类,更加灵活、线程安全,并支持多任务调度和线程池管理。

1. 使用ScheduledExecutorService创建定时任务

通过Executors工厂类获取ScheduledExecutorService实例,然后调用其调度方法来安排任务的执行。

基本使用步骤:

  • 使用Executors.newScheduledThreadPool(int corePoolSize)创建线程池。
  • 调用scheduleAtFixedRate()或scheduleWithFixedDelay()方法设置定时逻辑。
  • 传入Runnable任务、初始延迟、周期和时间单位。
  • 任务执行完毕后,记得调用shutdown()关闭线程池。
示例代码:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledTaskExample {
    public static void main(String[] args) {
        // 创建一个大小为2的调度线程池
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

        // 提交定时任务
        scheduler.scheduleAtFixedRate(() -> {
            System.out.println("执行任务: " + System.currentTimeMillis());
        }, 1, 2, TimeUnit.SECONDS); // 初始延迟1秒,之后每2秒执行一次

        // 模拟程序运行一段时间
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 关闭线程池
        scheduler.shutdown();
    }
}

2. scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

这两个方法都用于周期性执行任务,但行为不同:

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载

立即学习“Java免费学习笔记(深入)”;

  • scheduleAtFixedRate:按固定频率执行,例如每2秒一次,不管上个任务是否完成。如果任务执行时间超过周期,下一个任务会等它结束后立即开始(不会并发)。
  • scheduleWithFixedDelay:在上一个任务完成后,延迟指定时间再执行下一次。适合任务耗时不固定,需要确保间隔的情况。
示例:使用 scheduleWithFixedDelay
scheduler.scheduleWithFixedDelay(() -> {
    long start = System.currentTimeMillis();
    System.out.println("开始任务: " + start);
    try {
        Thread.sleep(3000); // 模拟耗时操作
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
    System.out.println("任务结束: " + System.currentTimeMillis());
}, 1, 2, TimeUnit.SECONDS);
// 第一次延迟1秒,之后每次任务结束后等待2秒再启动下一次

3. 注意事项与最佳实践

使用ScheduledExecutorService时,有几个关键点需要注意:

  • 避免任务中抛出未捕获异常,否则该任务将停止调度。建议在Runnable中使用try-catch包裹业务逻辑。
  • 合理设置线程池大小,避免资源浪费或调度阻塞。
  • 生产环境中应妥善处理shutdown,可结合Spring的@PreDestroy或JVM关闭钩子。
  • 对于更复杂的调度需求(如Cron表达式),建议使用Quartz或Spring Scheduling。

4. 结合Spring使用(可选扩展)

在Spring项目中,可以通过@Scheduled注解简化定时任务开发:

@Scheduled(fixedRate = 2000)
public void doTask() {
    System.out.println("Spring定时任务执行");
}

需在配置类上启用定时支持:@EnableScheduling。

基本上就这些。ScheduledExecutorService简单高效,是Java原生实现定时任务的首选方案。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2831

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

517

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7079

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3385

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4428

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3005

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4618

2023.08.10

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn