当前位置: 首页 > news >正文

使用 Java 实现一个简单且高效的任务调度框架

使用 Java 实现一个简单且高效的任务调度框架(2026年实用版)

任务调度框架是后台系统中的核心组件,用于管理定时任务、延迟任务、周期任务等。Java 生态中已有 Quartz、Spring Task 等成熟框架,但如果你想从零实现一个简单、高效的版本(适合学习/小项目),可以基于java.util.concurrent包构建——它原生支持线程池、多线程调度,避免从头造轮子。

设计原则(保持简单高效):

  • 核心功能:支持一次性任务、固定延迟任务、固定频率任务、任务取消。
  • 高效点:使用ScheduledThreadPoolExecutor作为底层引擎(JDK内置,高性能,支持优先级队列)。
  • 简单点:最小接口设计,无外部依赖,仅需 JDK 8+。
  • 局限:不支持持久化/分布式(如果需要,可扩展到 Redis/Zookeeper),不处理异常重试(可加装饰器)。
  • 适用场景:小中型应用、原型开发、面试手写题。
总体架构(用表格表示,便于理解)
组件描述实现方式
Task任务接口(Runnable 扩展,支持优先级/元数据)自定义接口,包含 id/priority
TaskScheduler调度器接口(提交任务、调度任务、取消任务)核心类,使用 ScheduledExecutorService
PriorityQueue内部队列(支持优先级调度)PriorityBlockingQueue
ThreadPool执行引擎(线程复用,避免频繁创建线程)ScheduledThreadPoolExecutor
示例扩展可加日志、监控(e.g., JMX)、异常处理通过装饰器模式
核心代码实现(完整、可直接复制运行)
  1. 任务接口(SimpleTask.java)
    支持基本元数据,便于追踪/取消。

    importjava.util.UUID;publicinterfaceSimpleTaskextendsRunnable{StringgetId();// 唯一ID,用于取消intgetPriority();// 优先级(越小越高,默认0)}// 默认实现(方便用户继承)abstractclassAbstractSimpleTaskimplementsSimpleTask{privatefinalStringid=UUID.randomUUID().toString();privatefinalintpriority;publicAbstractSimpleTask(intpriority){this.priority=priority;}@OverridepublicStringgetId(){returnid;}@OverridepublicintgetPriority(){returnpriority;}}
  2. 调度器实现(SimpleTaskScheduler.java)
    核心类,封装 ScheduledExecutorService。

    importjava.util.concurrent.*;importjava.util.Map;importjava.util.HashMap;publicclassSimpleTaskScheduler{privatefinalScheduledExecutorServiceexecutor;privatefinalMap<String,ScheduledFuture<?>>taskMap=newHashMap<>();// 追踪任务,便于取消publicSimpleTaskScheduler(intcorePoolSize){executor=Executors.newScheduledThreadPool(corePoolSize);}// 提交一次性任务(立即执行)publicvoidsubmit(SimpleTasktask){executor.execute(task);}// 调度延迟任务(delay 后执行一次)publicvoidschedule(SimpleTasktask,longdelay,TimeUnitunit){ScheduledFuture<?>future=executor.schedule(task,delay,unit);taskMap.put(task.getId(),future);}// 调度固定频率任务(initialDelay 后,每 period 执行一次)publicvoidscheduleAtFixedRate(SimpleTasktask,longinitialDelay,longperiod,TimeUnitunit){ScheduledFuture<?>future=executor.scheduleAtFixedRate(task,initialDelay,period,unit);taskMap.put(task.getId(),future);}// 调度固定延迟任务(initialDelay 后,每次执行完后延迟 delay 执行下一次)publicvoidscheduleWithFixedDelay(SimpleTasktask,longinitialDelay,longdelay,TimeUnitunit){ScheduledFuture<?>future=executor.scheduleWithFixedDelay(task,initialDelay,delay,unit);taskMap.put(task.getId(),future);}// 取消任务publicbooleancancel(StringtaskId){ScheduledFuture<?>future=taskMap.remove(taskId);if(future!=null){returnfuture.cancel(false);// false: 不中断正在运行的任务}returnfalse;}// 优雅关闭调度器publicvoidshutdown(){executor.shutdown();try{if(!executor.awaitTermination(60,TimeUnit.SECONDS)){executor.shutdownNow();}}catch(InterruptedExceptione){executor.shutdownNow();}}}
  3. 示例使用(Main.java)
    测试各种调度场景。

    publicclassMain{publicstaticvoidmain(String[]args){SimpleTaskSchedulerscheduler=newSimpleTaskScheduler(4);// 4 核心线程// 一次性任务SimpleTaskoneTimeTask=newAbstractSimpleTask(0){@Overridepublicvoidrun(){System.out.println("一次性任务执行: "+System.currentTimeMillis());}};scheduler.submit(oneTimeTask);// 延迟任务(5秒后执行)SimpleTaskdelayedTask=newAbstractSimpleTask(1){@Overridepublicvoidrun(){System.out.println("延迟任务执行: "+System.currentTimeMillis());}};scheduler.schedule(delayedTask,5,TimeUnit.SECONDS);StringdelayedId=delayedTask.getId();// 保存ID,用于可能取消// 固定频率任务(立即开始,每2秒执行一次)SimpleTaskfixedRateTask=newAbstractSimpleTask(2){@Overridepublicvoidrun(){System.out.println("固定频率任务: "+System.currentTimeMillis());}};scheduler.scheduleAtFixedRate(fixedRateTask,0,2,TimeUnit.SECONDS);// 固定延迟任务(1秒后开始,每次执行完后延迟3秒)SimpleTaskfixedDelayTask=newAbstractSimpleTask(3){@Overridepublicvoidrun(){System.out.println("固定延迟任务开始: "+System.currentTimeMillis());try{Thread.sleep(1000);}catch(InterruptedExceptione){}// 模拟耗时1秒System.out.println("固定延迟任务结束: "+System.currentTimeMillis());}};scheduler.scheduleWithFixedDelay(fixedDelayTask,1,3,TimeUnit.SECONDS);// 模拟运行10秒后取消一个任务try{Thread.sleep(10000);}catch(InterruptedExceptione){}scheduler.cancel(delayedId);// 取消延迟任务(如果还没执行)// 关闭调度器scheduler.shutdown();}}
性能优化 & 扩展建议(高效点)

运行 Main.java,你会看到控制台输出各种任务的执行时间戳。简单吧?这个框架参数少、开销低(JDK 原生),实际项目中可作为起点扩展。

如果你想加特定功能(e.g., Cron 表达式支持、持久化),或遇到报错,告诉我,我可以给你更详细的代码调整~

http://www.jsqmd.com/news/258826/

相关文章:

  • 免费网站进阶!——InfinityFree创建数据库教程 - Sail-With
  • 基于 Spring Boot 的 Web 三大核心交互案例精讲
  • 大兴安岭呼玛塔河漠河英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
  • 2026年母线槽厂家推荐榜:宝应东茂电气全系供应耐火/密集/封闭/管型母线槽,适配多场景电力传输 - 品牌推荐官
  • 2026年管道坡口机厂家实力推荐榜:深圳凯德盛全系供应,覆盖钢板/平板/便携式等10类机型 - 品牌推荐官
  • 【C++】哈希扩展——位图和布隆过滤器的介绍与实现
  • 2026年铝板厂家实力推荐榜:5754/6061/氧化/1060/3003/冲孔/5083/5052铝板全系供应,上海岱通铝业领衔 - 品牌推荐官
  • Proxmox VE Helper-Scripts版本更新测试计划:验证矩阵 - 教程
  • 重新定义需求分析:从“写文档”回归“造价值” - 实践
  • 2026年高压/夹布/大口径输水胶管权威推荐榜:河北鼎通橡塑制品有限公司适配矿山、建筑、农业多场景输水解决方案 - 品牌推荐官
  • Stirling
  • 2026年IP66庭院灯厂家权威推荐榜单:庭院太阳能灯/户外照明庭院灯/农村庭院灯/IP65庭院灯/乡村路灯源头厂家精选 - 品牌推荐官
  • 2026年管道设备推荐:沧州铭信管道有限公司,涂塑/耐磨/衬塑/衬胶/双金属管道全解析 - 品牌推荐官
  • 2025年郑州电线电缆回收公司推荐榜:郑州恒森二手空调回收,电缆回收/废旧电缆回收/旧电缆回收/回收电缆/收购电线电缆/回收废旧电缆/回收电线电缆/电缆收购/收购电缆公司精选 - 品牌推荐官
  • 2026年吨包袋厂家实力推荐:唐山吴晨嘉科技,防水/耐磨/定制吨包袋全系供应 - 品牌推荐官
  • 十年深耕,代码为证:深度盘点昊客网络APP/小程序/软件开发的实力服务与成功客户实践 - 深圳昊客网络
  • 2026年不锈钢球/302不锈钢球/轴承钢球厂家推荐:常州市苏南伟杰钢球有限公司全系产品供应 - 品牌推荐官
  • 2026年北京云服务器代理阿里云公司实力推荐榜单:云服务器代理华为云 /云服务器代理天翼云 /云服务器代理火山云 /云服务器代理腾讯云服务商精选 - 品牌推荐官
  • Windows免费开源神器!这款番茄时钟,治好了我10年拖延症!
  • 绥化市绥棱青冈庆安英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 2026年复卷机设备推荐榜:苏州富日智能装备有限公司,双轴/分切/全自动复卷机全系供应 - 品牌推荐官
  • 2025年辽宁儿童感统训练方法公司权威推荐榜单:儿童感统训练 /亲子感统训练 /感统训练游戏/ 幼儿感统训练/ 感统训练机构/ 感统训练中心服务精选 - 品牌推荐官
  • 备份恢复--SMP(软件制作平台)语言基础知识之三十九
  • 给电脑软件或者网站加密怎么弄?这款隐私保护加密软件来啦~可自定义密码,使用完全免费!
  • 2026年单锥真空干燥机推荐榜:常州市力群闪蒸干燥设备有限公司,螺带/螺旋/立式/大型/DZLG全系供应 - 品牌推荐官
  • 电脑端录音软件,使用完全免费,不限制录音时长和次数,可调节音质,增大降低音量,一键录制~自媒体必备神器!
  • 世纪联华充值卡回收攻略,三种方法助你变现 - 京回收小程序
  • 2026年定压补水/变频供水/换热/混水机组推荐:威海远大电器制造有限公司全系产品解析 - 品牌推荐官
  • 【路径规划】基于DWA实现机器人动态避障路径规划附Matlab代码