2011-10-18 4 views
117

J'ai besoin de planifier une tâche à exécuter à intervalle de temps fixe. Comment est-ce que je peux faire ceci avec le soutien de longs intervalles (par exemple sur chaque 8 heures)? J'utilise actuellement java.util.Timer.scheduleAtFixedRate. Est-ce que java.util.Timer.scheduleAtFixedRate prend en charge des intervalles de temps longs?Comment planifier une tâche périodique en Java?

Répondre

165

Utilisez un ScheduledExecutorService:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS); 
38

Vous devriez jeter un oeil à Quartz il est un framework java Wich fonctionne avec les éditions EE et SE et permet de définir des emplois pour exécuter un temps spécifique

8

Si vous voulez coller avec java.util.Timer, vous pouvez l'utiliser pour planifier à des intervalles de temps importants. Vous passez simplement dans la période que vous photographiez. Consultez la documentation here.

20

Essayez de cette façon ->

créer d'abord un TimeTask de classe qui exécuter votre tâche, il ressemble à:

public class CustomTask extends TimerTask { 

    public CustomTask(){ 

    //Constructor 

    } 

    public void run() { 
    try { 

     // Your task process 

      } catch (Exception ex) { 

     System.out.println("error running thread " + ex.getMessage()); 
    } 
} 

puis dans la classe principale, vous instancier la tâche et l'exécuter périodiquement démarré à une date spécifiée:

public void runTask(){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(
      Calendar.DAY_OF_WEEK, 
      Calendar.MONDAY 
     ); 
     calendar.set(Calendar.HOUR_OF_DAY, 15); 
     calendar.set(Calendar.MINUTE, 40); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 



     Timer time = new Timer(); // Instantiate Timer Object 

     // Start running the task on Monday at 15:40:00, period is set to 8 hours 
     // if you want to run the task immediately, set the 2nd parameter to 0 
     time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8)); 
} 
+5

Pour rendre le code plus lisible, vous pouvez modifier l'argument final dans votre appel de l'heure à TimeUnit.HOURS.toMillis (8) – darrenmc

8

Utilisez Google Goyave AbstractScheduledService comme ci-dessous:

public class ScheduledExecutor extends AbstractScheduledService 
{ 
    @Override 
    protected void runOneIteration() throws Exception 
    { 
     System.out.println("Executing...."); 
    } 

    @Override 
    protected Scheduler scheduler() 
    { 
     return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS); 
    } 

    @Override 
    protected void startUp() 
    { 
     System.out.println("StartUp Activity...."); 
    } 


    @Override 
    protected void shutDown() 
    { 
     System.out.println("Shutdown Activity..."); 
    } 

    public static void main(String[] args) throws InterruptedException 
    { 
     ScheduledExecutor se = new ScheduledExecutor(); 
     se.startAsync(); 
     Thread.sleep(15000); 
     se.stopAsync(); 
    } 

}

Si vous avez plus de services comme celui-ci, l'enregistrement, alors tous les services ServiceManager sera bon que tous les services peuvent démarrer et arrêter ensemble . Lisez here pour plus d'informations sur ServiceManager.

+0

Guava est maintenant sur GitHub. Voici un lien vers la nouvelle documentation [ServiceManager] (https://github.com/google/guava/wiki/ServiceExplained). – Renato

4

Si votre application utilise déjà framework Spring, vous avez Scheduling construit en

1

J'utilise la fonction de Spring Framework. (spring-context dépendance jar ou maven).

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 


@Component 
public class ScheduledTaskRunner { 

    @Autowired 
    @Qualifier("TempFilesCleanerExecution") 
    private ScheduledTask tempDataCleanerExecution; 

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */) 
    public void performCleanTempData() { 
     tempDataCleanerExecution.execute(); 
    } 

} 

TâchePlanifiée est ma propre interface avec ma méthode personnalisée execute, que j'appelle comme ma tâche planifiée.

Questions connexes