簡體   English   中英

計時器時間表運行方法每15分鍾

[英]Timer Schedule run method Every 15th Minute

我想每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 
        }
    }
}

澄清您的任務需要完全在每小時的特定分鍾(0、15、30、45)運行之后,我真的建議您研究一個合適的作業調度庫,例如Quartz

另一方面,如果您真的想堅持使用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");
    }
}

這是一個有效的例子

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");
        }
    }

干杯,

不鼓勵使用Timer ,請參閱javadoc:

Java 5.0引入了java.util.concurrent包,其中的並發實用程序之一是ScheduledThreadPoolExecutor,它是一個線程池,用於以給定的速率或延遲重復執行任務。 實際上,它是Timer / TimerTask組合的更通用的替代品,因為它允許多個服務線程,接受各種時間單位,並且不需要子類化TimerTask(只需實現Runnable)。 使用一個線程配置ScheduledThreadPoolExecutor使其等效於Timer。

而是使用ScheduledThreadPoolExecutor

 Executors.newScheduledThreadPool(n)
.scheduleAtFixedRate(()->{...}, 0, 15, TimeUnit.MINUTES)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM