计时器计划运行方法每15分钟

时间:2015-05-05 08:32:30

标签: java timer

我想每15分钟运行一次方法,例如0:15,0:30,0:45,1:00,1:15,1:30等。

请告诉我我的位置 错误的下面的代码不能正常工作?

public class MainClass{
    //Set Calendar
    Calendar calendar =  Calendar.getInstance();
    calendar.set(Calendar.MINUTE , 15);
    private Timer timer;
    switch(flag) {  //here flag 1 ,2 etc
    case 1: //Initial Server 
    timer.schedule(new MyTask(),0);
    break;
    case:2
    timer.schedule(new MyTask(),calendar.getTime(),Long.valueOf(1)*1000*900);
    break;
    }  
    class MyTask extends TimerTask{
        public void run() {
        //Method Stuff here 
        }
    }
}

3 个答案:

答案 0 :(得分:3)

继续澄清任务需要在一小时的特定时间(0,15,30,45)完全运行,我真的建议您查看一个正确的作业调度库,例如{{3 }}

另一方面,如果你真的想坚持使用Timer,你的问题就是为你的计时器找到正确的第一次运行时间,然后从那时起每15分钟运行一次。

你可以按照Ben的建议使用Joda,但这段代码可能适合你:

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

public class TimerExample {

    private static Timer timer = new Timer();

    private static Calendar getFirstTime() {
        Calendar cal = Calendar.getInstance();

        int currentMinute = cal.get(Calendar.MINUTE);

        if (currentMinute < 45) {
            cal.set(Calendar.MINUTE, 45);
        }
        if (currentMinute < 30) {
            cal.set(Calendar.MINUTE, 30);
        }
        if (currentMinute < 15) {
            cal.set(Calendar.MINUTE, 15);
        }
        if (currentMinute >= 45) {
            cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + 1);
            cal.set(Calendar.MINUTE, 0);
        }

        cal.set(Calendar.SECOND, 0);

        return cal;
    }

    public static void main(String... args) {
        Calendar firstTaskTime = getFirstTime();
        System.out.println("Task will start at: " + firstTaskTime.getTime());
        timer.schedule(new MyTask(), firstTaskTime.getTime(), 1000 * 60 * 15);
    }
}

class MyTask extends TimerTask {
    public void run() {
        System.out.println("running task");
    }
}

答案 1 :(得分:2)

这是一个工作示例

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

public class MainClass {

    private static Timer timer = new Timer();

    public static void main(String...args){
           timer.schedule (new MyTask(),0,1000*60*15);
    }
}

class MyTask extends TimerTask {
        public void run() {
            System.out.println("hello");
        }
    }

干杯,

答案 2 :(得分:2)

不鼓励

In [2]: states = ["New York", "California", "Nebraska", "Idaho"] In [3]: postal_addr = "1234 1st E St San Jose California 95112" In [4]: ''.join(state for state in states if state in postal_addr) Out[4]: 'California' ,请参阅javadoc:

  

Java 5.0引入了java.util.concurrent包和其中一个   其中的并发实用程序是ScheduledThreadPoolExecutor   是一个线程池,用于以给定的速率重复执行任务或   延迟。它实际上是一种更通用的替代品   Timer / TimerTask组合,因为它允许多个服务线程,   接受各种时间单位,不需要子类化TimerTask   (只需实现Runnable)。配置ScheduledThreadPoolExecutor   使用一个线程使其等同于Timer。

相反,请使用 ScheduledThreadPoolExecutor

Timer