2015-05-05 2 views
1

Я хотел бы запустить методу каждые 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

вы получаете любое исключение –

+0

'новый MyTask' нуждается в круглые скобки, чтобы работать:' Новый MyTask() '' – user2465896

+0

timer.schedule (newMyTask (ложь) calendar.getTime(), Long.valueOf (1) * 1000 * 900); 'Я пробовал, что даже не работает? Правильно ли это мой код? – sameer

ответ

3

Вслед за ваше уточнение, что задача должна работать именно в конкретных минутах часов (0, 15, 30 , 45), я действительно рекомендую вам изучить надлежащую библиотеку планирования заданий, такую ​​как Quartz.

С другой стороны, если вы действительно хотите использовать Таймер, ваша проблема заключается в том, чтобы найти правильное первое время работы для вашего таймера, который затем может запускаться каждые 15 минут с этого момента.

Вы можете сделать это с 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"); 
    } 
} 
+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"); 
     } 
    } 

Cheers,

+0

timer.schedule (task, delay) может принимать 3 аргумента (runnable, first exec, delay) –

+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 с одним потоком делает его эквивалентным таймеру.

Вместо этого используйте ScheduledThreadPoolExecutor:

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

Но все же мой первоначальный запуск запускается. – sameer

Смежные вопросы