[英]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.