天天看点

java 指定时间执行任务

package com.lyis.listener;

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import com.lyis.task.NoticeTask;

public class WebContextListener implements ServletContextListener{

private Timer timer;

public void contextDestroyed(ServletContextEvent sce) {

if(timer != null) {

timer.cancel();

}

}

public void contextInitialized(ServletContextEvent sce) {

timer = new Timer();

Calendar calendar = Calendar.getInstance();

// 指定01:00:00点执行

calendar.set(Calendar.HOUR_OF_DAY, 1);

calendar.set(Calendar.MINUTE, 0);

calendar.set(Calendar.SECOND, 0);

Date date = calendar.getTime();

timer = new Timer();

timer.schedule(new NoticeTask(),date);

// 若需循环执行,需改为以下代码

// 任务执行周期(毫秒)

// Long period = Long.valueOf(24 * 60 * 60 * 1000);

// timer.schedule(new NoticeTask(), date, period);

}

package com.lyis.task;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.TimerTask;

public class NoticeTask extends TimerTask{

public void run() {

System.out.println("定时执行,当前时间:" + getTimeStamp());

}

private String getTimeStamp() {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

return sdf.format(new Date());

}

}

如果是循环定时执行还存在一些问题:

假如任务定在09:00:00执行,下一次执行则会受服务启动时间影响

如果在09:00:00之后重启了服务,则下一次任务不是在指定的时间执行,而是服务启动时间,反之则能按指定时间执行任务。