2015-06-09 43 views
6

Vogliamo pianificare un processo Java da eseguire fino a un intervallo di tempo specifico. Attualmente sto pensando di utilizzare TimerTask per pianificare questo processo. All'inizio di ogni ciclo, controllerà l'ora corrente e quindi confronterà con il tempo dato e interromperà il processo se è trascorso il tempo. Il nostro codice è qualcosa di simile di seguito:Pianificazione del processo java per un intervallo di tempo specifico con un determinato intervallo di tempo

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

    } 

} 

Esiste un approccio migliore per questo?

risposta

3

Invece di controllare se il limite di tempo è stato raggiunto in ogni singola iterazione, è possibile programmare un'altra operazione per il suddetto limite di tempo e annullare la chiamata sul timer.

A seconda della complessità, è possibile considerare l'utilizzo di un servizio ScheduledExecutor come ScheduledThreadPoolExecutor. See in this answer when and why.

esempio di lavoro semplice con timer:

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

Grazie per l'approach.I possono provare questo. – Anupam

+0

Ho aggiornato la risposta con un esempio. –

+0

Grazie per il codice di esempio. Probabilmente andremo con ScheduledExecutorService, ma per ora il codice sopra funzionerà perfettamente per noi. – Anupam

2

È possibile utilizzare RxJava, un potente libreria per la programmazione reattiva.

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){ } 

È anche possibile utilizzare la sintassi lambda:

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