在特定时间定义例行任务

时间:2013-12-01 15:39:58

标签: java

目前我正在使用Java计时器来重复任务,但是目前,我只能指定每30秒的时间......通过使用

 Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

}
  }, 30 * 1000, 30 * 1000);

但我真正想要的是这种约束:
任务将在每个HH:MM运行,MM(分钟)= 00,HH(小时)可以是10,15,19 ...... 我希望我能够清楚地描述问题,就像每个HH时钟一样,任务将会运行。
我发现如果我不在HH:00时启动定时器,则无法使用Timer,间隔将设置为6000。 我想每天使用它倍数(就像每小时一样)
非常感谢你。

4 个答案:

答案 0 :(得分:4)

您可以使用目标时间创建一个新的Date对象,然后将其转换为系统时间并从System.currentTimeMillis()中减去它并睡眠那么多ms

如:

Date alarm = DateFormat.parse(___your date here___);
long msToSleep = alarm.getTime() - System.currentTimeMillis();
// Your provided code to sleep for msToSleep ms

答案 1 :(得分:1)

You can use below code to run TimerTask every hours HH:00:-
Timer timer = new Timer();
        Calendar cd = Calendar.getInstance();
        Date dt = cd.getTime();
        long mmss = dt.getMinutes() * 60 + dt.getSeconds();
        long remTime = 60 * 60 * 60 - mmss;

        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

            }
        }, remTime * 1000, 60*60 * 60 * 1000);

答案 2 :(得分:1)

您可以按Calendar定义计时器的开始时间。计时器将在Calendar时间开始,

  Calendar today = Calendar.getInstance();
  Calendar startCal = Calendar.getInstance();
    startCal.set(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
          today.get(Calendar.DAY_OF_MONTH), today.get(Calendar.HOUR),
                             00);
                              |_ Here set the start minutes at 00

    Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            System.out.println("beep");
        }
    }, startCal.getTime(), 30 * 1000);
         |
         |_ It will start on every 00 minutes of 

答案 3 :(得分:0)

你可以这样做:

private static final int SLEEP_TIME=1000;//your sleep time (mili second)
public void Routine(){
    while(true){
        try {
            //your code goes here
            Thread.sleep(SLEEP_TIME);
            if(someCondition)
               break;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}