Nos exemples jusque-là ont illustré la création de tâches simples, la planification et l'indication de la progression. Le mécanisme de planification des tâches est vraiment plus puissant que ce que vous avez vu pour le moment. Vous pouvez bénéficier d'un contrôle à granularité fine du mode de planification de la tâche à l'aide des propriétés, des délais et des conditions de planification personnalisées.
Une priorité peut être utilisée pour définir l'importance d'une tâche vis-à-vis des autres tâches dans le système. La définition de la priorité d'une tâche n'affecte pas une tâche qui est déjà en cours d'exécution, mais elle affectera la planification d'une tâche en attente vis-à-vis des autres tâches. La priorité d'une tâche peut être l'une des constantes de priorité prédéfinies :
La priorité par défaut pour une tâche est LONGUE. Le fragment de code ci-dessous crée la tâche évidente utilisée précédemment, mais définit la priorité sur DECORATION pour indiquer qu'elle possède le niveau de priorité le plus faible :
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Pour contrôler la planification d'une tâche, vous avez également la possibilité de recourir à une autre technique qui consiste à utiliser une délai de planification. Un délai de planification peut être spécifié lorsque la tâche est planifiée. Un délai, correspondant au nombre de millisecondes défini, est spécifié pour la tâche avant la planification.
TrivialJob job = new TrivialJob(); job.schedule(1000); // patienter une seconde avant la planification
La planification d'une tâche qui est déjà en attente ou qui est en pause reste sans effet. Cependant, la planification d'une tâche qui est déjà en cours d'exécution entraîne sa replanification une fois qu'elle est terminée. Il s'agit d'un mécanisme pratique pour les tâches répétitives comme les boucles d'interrogation en tâche de fond. Si la tâche est replanifiée plusieurs fois au cours de son exécution, elle ne sera replanifiée qu'une seule fois avec le délai le plus récent indiqué. Le fragment de code ci-dessous définit une tâche qui se replanifie elle-même de manière à s'exécuter 10 secondes après la fin de l'itération actuelle.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Running the job."); // replanifier après 10 secondes schedule(10000); return Status.OK_STATUS; } }
Un autre protocole de la classe Job permet à une tâche de vérifier les conditions préalables juste avant qu'elle soit planifiée ou exécutée. Cet état de fait est mieux illustré par l'exemple de code suivant :
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
La méthode shouldSchedule est appelée juste avant que le gestionnaire de tâches place la tâche dans la file d'attente. Cela permet à la tâche de s'annuler elle-même si les conditions préalables de base pour la planification ne sont pas remplies. La tâche doit renvoyer la valeur false s'il n'est pas approprié de la planifier. De même, la méthode shouldRun est appelée juste avant que le gestionnaire de tâches exécute la tâche. Toute autre condition qui doit être remplie avant que la tâche soit exécutée doit être vérifiée à ce moment.