Java定时任务

本文详细介绍了Java中使用java.util.Timer和java.util.TimerTask实现定时任务的方法。包括如何创建定时器对象,设置任务执行时间间隔及任务执行逻辑。并通过具体实例展示了schedule与scheduleAtFixedRate方法的区别。

http://blog.youkuaiyun.com/xyang81/article/details/7425943

在日常工作中,定时进行任务调度的业务随处可见,比如:定时清理系统的临时文件、有新的活动定时向用户发送电子邮件、定时检查系统是否需要更新、定时发送短信等业务。在Java中由两个类完成定时任务的调度,分别为:java.util.Timer和java.util.TimerTask

创建一个定时任务的步聚:

1、创建一个定时器(Timer)对象

2、调用该对象的schedule(TimerTask task, long delay, long period)scheduleAtFixedRate(TimerTask task, long delay, long period)方法


任务调度方法参数说明:

task:表示要执行的具体任务

delay表示任务创建完成后,第一次什么时候开始执行该任务,以毫秒为单位

period:表示第一次执行完任务后,后续重复执行该任务的时间间隔是多长,以毫秒为单位


schedule方法与scheduleAtFixedRate方法的区别:

方法任务执行时间当任务执行时间大于间隔时间时
schedule上次任务的结束时间+时间间隔阻塞式,任务会延后,等待前面的任务执行完,再执行延务后的任务
scheduleAtFixedRate上次任务的执行时间+时间间隔任务不会延后,但要考虑多线程并发的问题。因为当一个任务还没执行完时,下一个时间间隔任务又会启动,执行相同的任务

注意:每启动一个新任务,就会启动一个新的线程!


实例:

[java]  view plain copy
  1. package taskschedule;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Calendar;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  
  7.   
  8. /* 
  9.  * 定时器 
  10.  *  
  11.  * schedule():下一次任务的执行时间,等于上一次任务的结束时间+时间间隔 
  12.  *  
  13.  * scheduleAtFixedRate():下一次任务的执行时间,等于上一次任务的开始时间+时间间隔 
  14.  *  
  15.  * 当执行任务的时间大于时间间隔时: 
  16.  * schedule任务会延后。 
  17.  * scheduleAtFixedRate任务不会延后,仍然在时间间隔内执行,存在并发性,要考虑线程同步的问题 
  18.  */  
  19. public class TimerTest {  
  20.       
  21.     private static int count = 0;  
  22.       
  23.     public static void main(String[] args) {  
  24.         task_1();  
  25.           
  26.         //task_2();  
  27.           
  28.         //task_3();  
  29.           
  30.         //task_4();  
  31.           
  32.         //主线程  
  33.         while(true) {  
  34.             System.out.println(Calendar.getInstance().get(Calendar.SECOND));  
  35.             try {  
  36.                 Thread.sleep(1000);  
  37.             } catch (InterruptedException e) {  
  38.                 e.printStackTrace();  
  39.             }  
  40.         }  
  41.     }  
  42.       
  43.     //任务1:第一次延迟3秒后启动任务,后续每隔2秒启动一次任务  
  44.     private static void task_1() {  
  45.         new Timer().schedule(new TimerTask(){  
  46.   
  47.             @Override  
  48.             public void run() {  
  49.                 System.out.println(Thread.currentThread().getName() + "定时任务已启动!");  
  50.                   
  51.             }}, 3000,2000);   
  52.     }  
  53.       
  54.     //任务2:交互执行,方式1:第一次延迟2秒后启动任务,后续每隔在3秒和6秒之间切换启动任务  
  55.     private static void task_2() {  
  56.         class MyTimerTask extends TimerTask {  
  57.               
  58.             @Override  
  59.             public void run() {  
  60.                 count = (count+1)%2;  
  61.                 System.out.println(Thread.currentThread().getName() + "定时任务已启动!");  
  62.                   
  63.                 new Timer().schedule(new MyTimerTask(), 3000 + 3000 * count);   //循环调用  
  64.             }  
  65.         }  
  66.           
  67.         new Timer().schedule(new MyTimerTask(), 2000);  //2秒后启动定时器  
  68.     }  
  69.       
  70.     //任务3:交互执行,方式2:第一次延迟2秒后启动任务,后续每隔在3秒和6秒之间切换启动任务  
  71.     public static void task_3() {  
  72.         new Timer().schedule(new MyTimerTaskA(), 300);  
  73.     }  
  74.       
  75.     //任务4:演示scheduleAtFixedRate方法,第一次延迟2秒后启动任务,后续每隔3秒后启动任务,但任务执行时间大于等于6秒  
  76.     public static void task_4() {  
  77.         TimerTask task = new TimerTask(){  
  78.   
  79.             @Override  
  80.             public void run() {  
  81.                 System.out.println("execute task:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));  
  82.                 try {  
  83.                     Thread.sleep(6000);  
  84.                 } catch (InterruptedException e) {  
  85.                     e.printStackTrace();  
  86.                 }  
  87.                 System.out.println(Thread.currentThread().getName() + "定时任务已启动!");  
  88.             }  
  89.         };  
  90.           
  91.         new Timer().scheduleAtFixedRate(task, 20003000);  
  92.     }  
  93. }  
  94.   
  95. //描述2个任务切换启动  
  96. class MyTimerTaskA extends TimerTask {  
  97.   
  98.     @Override  
  99.     public void run() {  
  100.         System.out.println(Thread.currentThread().getName() + "任务已启动!");  
  101.         new Timer().schedule(new MyTimerTaskB(),2000);  
  102.     }  
  103.       
  104. }  
  105.   
  106. class MyTimerTaskB extends TimerTask {  
  107.       
  108.     @Override  
  109.     public void run() {  
  110.         System.out.println(Thread.currentThread().getName() + "任务已启动!");  
  111.         new Timer().schedule(new MyTimerTaskA(), 4000);  
  112.     }  
  113.       
  114. }  

任务执行结果:

任务1:


任务2:


任务3:


任务4:


但JDK提供的定时器任务功能有限,不能完成一些复杂的业务,比如:要每年单月的每周星期三的下午5点10分要执行一个任务,JDK则处理不了。不过不要担心,市面上已经有开源的任务调度框架:Quartz,官网:http://www.quartz-scheduler.org/

需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕“需求响应动态冰蓄冷系统与需求响应策略的优化研究”展开,基于Matlab代码实现,重点探讨了冰蓄冷系统在电力需求响应背景下的动态建模与优化调度策略。研究结合实际电力负荷与电价信号,构建系统能耗模型,利用优化算法对冰蓄冷系统的运行策略进行求解,旨在降低用电成本、平衡电网负荷,并提升能源利用效率。文中还提及该研究为博士论文复现,涉及系统建模、优化算法应用与仿真验证等关键技术环节,配套提供了完整的Matlab代码资源。; 适合人群:具备一定电力系统、能源管理或优化算法基础,从事科研或工程应用的研究生、高校教师及企业研发人员,尤其适合开展需求响应、综合能源系统优化等相关课题研究的人员。; 使用场景及目标:①复现博士论文中的冰蓄冷系统需求响应优化模型;②学习Matlab在能源系统建模与优化中的具体实现方法;③掌握需求响应策略的设计思路与仿真验证流程,服务于科研项目、论文写作或实际工程方案设计。; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注系统建模逻辑与优化算法的实现细节,按文档目录顺序系统学习,并尝试调整参数进行仿真对比,以深入理解不同需求响应策略的效果差异。
综合能源系统零碳优化调度研究(Matlab代码实现)内容概要:本文围绕“综合能源系统零碳优化调度研究”,提供了基于Matlab代码实现的完整解决方案,重点探讨了在高比例可再生能源接入背景下,如何通过优化调度实现零碳排放目标。文中涉及多种先进优化算法(如改进遗传算法、粒子群优化、ADMM等)在综合能源系统中的应用,涵盖风光场景生成、储能配置、需求响应、微电网协同调度等多个关键技术环节,并结合具体案例(如压缩空气储能、光热电站、P2G技术等)进行建模与仿真分析,展示了从问题建模、算法设计到结果验证的全流程实现过程。; 适合人群:具备一定电力系统、能源系统或优化理论基础,熟悉Matlab/Simulink编程,从事新能源、智能电网、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展综合能源系统低碳/零碳调度的科研建模与算法开发;②复现高水平期刊(如SCI/EI)论文中的优化模型与仿真结果;③学习如何将智能优化算法(如遗传算法、灰狼优化、ADMM等)应用于实际能源系统调度问题;④掌握Matlab在能源系统仿真与优化中的典型应用方法。; 阅读建议:建议结合文中提供的Matlab代码与网盘资源,边学习理论模型边动手调试程序,重点关注不同优化算法在调度模型中的实现细节与参数设置,同时可扩展应用于自身研究课题中,提升科研效率与模型精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值