TimerTask 当前时间没有执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TimerTask 当前时间没有执行相关的知识,希望对你有一定的参考价值。
package nariis.stabilityRule;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class StopSelfTime implements ServletContextListener
private Timer timer=null;
public StopSelfTime()
TimerTask task = new TimerTask()
@Override
public void run()
try
//String sql="UPDATE MW_APP.MWT_UD_SR_STABILITYLIMIT SET STATE_SORT='已作废 ' WHERE OBJ_ID IN( select OBJ_ID from mw_app.MWT_UD_SR_STABILITYLIMIT_WF where to_Date(getDate(),'yyyy-MM-dd')-FAILURE_TIME==0 )";
//getDataAccessService().executeNonQuery(sql);
System.out.println("success");
catch (Exception e)
System.out.println("稳定限额同步状态定时任务执行失败"+e);
// 1次
;
//设置执行时间
Calendar calendar = Calendar.getInstance();
//calendar.set(Calendar.DAY_OF_MONTH,-1);
calendar.set(Calendar.HOUR_OF_DAY,20);
calendar.set(Calendar.MINUTE, 13);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();
timer = new Timer(false);
System.out.println(date);
if (date.before(new Date()))
date = this.addDay(date, 1);
//时间间隔
long PERIOD_DAY = 24 * 60 * 60 * 1000;
//每天的date时刻执行task,每隔2秒重复执行
timer.schedule(task, date, PERIOD_DAY);
//每天的date时刻执行task, 仅执行一次
//timer.schedule(task, date);
// 增加或减少天数
public Date addDay(Date date, int num)
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
public static void main (String[] args)
new StopSelfTime();
//监控
public void contextDestroyed(ServletContextEvent arg0)
new StopSelfTime();
public void contextInitialized(ServletContextEvent arg0)
timer.cancel();
jdk TimerTask 定时任务,按指定时间无法启动,把时间设置到今天以前的时间是可以执行的
恩,要做检查,临时的办法
纠结的一晚上,代码没问题
WIN7和JDK1.5环境下获取系统时间错误
java定时器
总结
1、执行计划的任务放在TimerTask的子类中,由Timer进行该任务。
2、创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束。希望创建的线程为守护线程,则创建时需设置Timer timer=new Timer(true);
3、执行任务的时间早于当前时间,任务会立即执行。
4、TimerTask是以队列的方式一个个顺序执行的。当前面的任务消耗时间较长,则后面的任务运行的时间也会延后。
比如,假定Task1执行需2s,Task2在Task1开始之后1s需被执行。结果是执行完Task1后,立即执行Task2。(实际也符合第3点)
5、如果没有延迟,则执行任务的时间是上一次任务开始的时间加上poried的时间。如果延迟了,则执行任务的时间为上一个任务的结束时间。(补充第4条)
6、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。(下面由代码解释)
7、异常方面。如果timer中执行任务时发生异常,则结束该timer线程,不会在执行任何任务。
常用例子
1、示例
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * Created by zay on 2016/12/8. */ public class TimerTest { public static void main(String[] args) { System.out.println("当前时间:"+new Date()); //执行计划的任务放在TimerTask的子类中,由Timer进行该任务。 Timer timer = new Timer(); //创建一个任务,1s后开始执行,并此后每隔2s执行。 timer.schedule(new TimerTask() { @Override public void run() { System.out.println(new Date() + "任务一"); } },1000,2000); //创建一个任务,十天后执行。 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE,1); Date runDate = calendar.getTime(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println(new Date() + "任务二"); } },runDate); //timer.cancel(); 调用TImer的cancel()方法会清空该TImer的所有任务。 //timerTask.cancel(); 调用TImerTask的cancel()方法则会在TImer中取消该任务。 } }
2、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * Created by zay on 2016/12/8. */ public class TimerTest { public static void main(String[] args) { System.out.println("当前时间:"+new Date()); Calendar calendar=Calendar.getInstance(); calendar.add(Calendar.SECOND,-100); //设置一个比较早的时间 Date earlyDate = calendar.getTime(); Timer timer = new Timer(); System.out.printf(new Date() + " 现在开始执行任务"); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println(new Date() + " 任务一"); } },earlyDate,5000); /*timer.schedule(new TimerTask() { @Override public void run() { System.out.println(new Date() + " 任务一"); } },earlyDate,5000);*/ } }
// schedule方法的输出(注意比对执行任务的时间) //scheduleAtFixedRate方法的输出
解释:当执行任务的时间早于当前时间时,比如示例中,执行任务的时间早于当前任务100s,那么这段时间理论应该有的任务怎么处理呢?
schedule选择抛弃不理,以当前的时间为新的起点,而scheduleAtFiexdRate则会一口气将这些任务顺序都执行完毕。
以上是关于TimerTask 当前时间没有执行的主要内容,如果未能解决你的问题,请参考以下文章
ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”
ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”
ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”