2015-05-05 63 views
1

我想運行方法每15分鐘例如0:15,0:30,0:45,1:00,1:15,1:30等計時器計劃運行方法每15分鐘

請讓我知道我在哪裏有 使錯誤下面的代碼無法正常工作?

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

你得到任何異常 –

+0

'新MyTask'需要括號工作:'新MyTask()'' – user2465896

+0

timer.schedule(newMyTask(假) calendar.getTime(),Long.valueOf(1)* 1000 * 900);'我已經嘗試過,甚至不工作?它是否正確我的代碼? – sameer

回答

3

您澄清的後續行動,該任務需要的時間(0,15,30的特定分鐘正好運行,45),我真的建議你看看一個合適的作業調度庫,如Quartz。另一方面,如果你確實想堅持使用定時器,你的問題是真的爲你的定時器找到正確的第一次運行時間,然後可以每隔15分鐘運行一次。

你可以用喬達做到這一點,由Ben的建議,但是這個代碼可能會爲你工作:

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

謝謝你回覆我,但仍然運行方法執行初始服務器啓動。 – sameer

+0

謝謝,但仍然初始服務器啓動運行方法執行請讓我知道?請看我的帖子我已更新? – sameer

+0

但仍然初始服務器啓動執行運行方法,所以最好的方式是石英或喬達,因爲我是初學者請建議我。謝謝 – sameer

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

乾杯,

+0

timer.schedule(任務,延遲)可能需要3個參數(可運行,第一個exec,延遲) –

+0

我之前已經評論過您對2參數調用的使用,定時器一次。你在同一時間修復它! – ktorn

+0

當定時器計劃初始啓動服務器運行方法執行,但我需要每個時鐘第15分鐘例如:0:15,0:30,0:45,1:00,1:15.etc。 – sameer

2

Timer不鼓勵,看到的Javadoc:

Java 5.0中引入了java.util.concurrent包和其中的其中一個併發實用程序是ScheduledThreadPoolExecutor,其中 是用於以給定速率或 延遲重複執行任務的線程池。它實際上是替代 Timer/TimerTask組合的更多功能的替代品,因爲它允許多個服務線程,並且不需要子類化TimerTask (只實現Runnable)。使用一個線程配置ScheduledThreadPoolExecutor 使其等價於Timer。

相反,使用的ScheduledThreadPoolExecutor

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

但仍然執行我的初始服務器啓動運行方法。 – sameer

相關問題