我如何每天下午2点运行我的TimerTask

BOS*_*OSS 35 java timer scheduled-tasks

我想每天下午2点执行一份工作.java.util.Timer我可以用哪种方法安排工作?

2小时后,它将停止工作并重新安排在第二天下午2点.

Dan*_*ber 56

Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 2);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);

// every night at 2am you run your task
Timer timer = new Timer();
timer.schedule(new YourTask(), today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); // period: 1 day
Run Code Online (Sandbox Code Playgroud)

  • 投票,但不被接受为最简单的答案,@Daniel Gerber?我想知道,.. (2认同)

hmj*_*mjd 23

您可以使用Timer.schedule(TimerTask task, Date firstTime, long period)方法,设置firstTime为今天下午2点,设置period为24小时:

从指定时间开始,为重复的固定延迟执行安排指定的任务.随后的执行大约定期进行,以指定的时间段分开.

  • 这不符合要求.夏令时将改变预定时间. (5认同)
  • @SunilKumarBM,是正面还是负面? (2认同)

BOS*_*OSS 15

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;


public class MyTimerTask extends TimerTask {
    private final static long ONCE_PER_DAY = 1000*60*60*24;

    //private final static int ONE_DAY = 1;
    private final static int TWO_AM = 2;
    private final static int ZERO_MINUTES = 0;


    @Override
    public void run() {
        long currennTime = System.currentTimeMillis();
        long stopTime = currennTime + 2000;//provide the 2hrs time it should execute 1000*60*60*2
          while(stopTime != System.currentTimeMillis()){
              // Do your Job Here
            System.out.println("Start Job"+stopTime);
            System.out.println("End Job"+System.currentTimeMillis());
          }
    }
    private static Date getTomorrowMorning2AM(){

        Date date2am = new java.util.Date(); 
           date2am.setHours(TWO_AM); 
           date2am.setMinutes(ZERO_MINUTES); 

           return date2am;
      }
    //call this method from your servlet init method
    public static void startTask(){
        MyTimerTask task = new MyTimerTask();
        Timer timer = new Timer();  
        timer.schedule(task,getTomorrowMorning2AM(),1000*10);// for your case u need to give 1000*60*60*24
    }
    public static void main(String args[]){
        startTask();

    }

}
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 5

我发现最简单的方法一直是通过Windows中的Task Scheduler和Linux中的cron。

但是对于Java,请看一下Quartz Scheduler

从他们的网站:

Quartz是功能齐全的开源作业调度服务,可以与几乎所有Java EE或Java SE应用程序集成或一起使用-从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作。任务定义为标准Java组件的作业,它们实际上可以执行您可以对其执行的任何编程操作。Quartz Scheduler包含许多企业级功能,例如JTA事务和集群。