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 定时任务,按指定时间无法启动,把时间设置到今天以前的时间是可以执行的

参考技术A 在Servlet中做定时任务,不好吧追问

恩,要做检查,临时的办法
纠结的一晚上,代码没问题
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 当前时间没有执行的主要内容,如果未能解决你的问题,请参考以下文章

java定时器

ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

定时器Timer

java中如何控制时间间隔?