2015-06-09 1 views
6

Мы хотим запланировать процесс java для запуска до определенного временного интервала. В настоящее время я собираюсь использовать TimerTask, чтобы запланировать этот процесс. В начале каждого цикла проверяется текущее время, а затем сравнивается с заданным временем и останавливается процесс, если время истекло. Наш код является то, как показано ниже:Планирование java-процесса для определенного интервала времени с заданной задержкой

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

public class Scheduler extends TimerTask{ 

    public void run(){ 
     //compare with a given time, with getCurrentTime , and do a System.exit(0); 
     System.out.println("Output"); 
    } 

    public static void main(String[] args) { 
     Scheduler scheduler = new Scheduler(); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(scheduler, 0, 1000); 

    } 

} 

Есть ли лучший подход для этого?

ответ

3

Вместо того, чтобы проверять, достигнут ли срок в каждой итерации, вы можете запланировать еще одну задачу за указанный срок и отменить вызов на вашем таймере.

В зависимости от сложности вы могли бы подумать об использовании ScheduledExecutorService, например ScheduledThreadPoolExecutor. See in this answer when and why.

Простой рабочий пример с таймером:

public class App { 
    public static void main(String[] args) { 
     final Timer timer = new Timer(); 
     Timer stopTaskTimer = new Timer(); 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("Output"); 
      } 
     }; 
     TimerTask stopTask = new TimerTask() { 
      @Override 
      public void run() { 
       timer.cancel(); 
      } 
     }; 

     //schedule your repetitive task 
     timer.scheduleAtFixedRate(task, 0, 1000); 
     try { 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date date = sdf.parse("2015-06-09 14:06:30"); 
      //schedule when to stop it 
      stopTaskTimer.schedule(stopTask, date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Спасибо за approach.I может попробовать это. – Anupam

+0

Я обновил ответ на примере. –

+0

Спасибо за образец кода. Вероятно, мы поедем с ScheduledExecutorService, но пока этот код будет отлично работать для нас. – Anupam

2

Вы можете использовать RxJava, очень мощную библиотеку для реактивного программирования.

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.subscribe(new Action1() { 
         @Override 
         public void call(Object o) { 
          System.out.println("Hi "+o); 
         } 
        } 

) ; 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ } 

Вы можете даже использовать синтаксис лямбды:

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.forEach(it -> System.out.println("Hi " + it)); 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ }