Pianificazione dei lavori

Negli esempi precedenti sono state illustrate le operazioni di creazione, pianificazione e avanzamento dei lavori. Il meccanismo di pianificazione dei lavori è in realtà molto più complesso di quanto appaia. È possibile esercitare uno stretto controllo sul modo in cui un lavoro viene pianificato utilizzando priorità, ritardi e condizioni di pianificazione personalizzate.

Priorità dei lavori

La priorità di un lavoro può essere utilizzata per stabilire l'importanza di un lavoro rispetto agli altri lavori del sistema. L'impostazione della priorità di un lavoro non influisce su un lavoro già in esecuzione ma influisce sul modo in cui un lavoro in attesa viene pianificato rispetto ad altri lavori. La priorità di un lavoro può essere una delle varie costanti di priorità precedentemente definite:

La priorità predefinita per un lavoro è LONG. Il frammento di seguito riportato crea il lavoro di poca importanza utilizzato in precedenza, ma imposta la priorità su DECORATE per indicare che il lavoro ha il livello di priorità più basso.

   TrivialJob job = new TrivialJob();
   job.setPriority(Job.DECORATE);
   job.schedule();

Pianificazione con ritardo

Un'altra tecnica per controllare la pianificazione di un lavoro è utilizzare un ritardo di pianificazione. Un ritardo di pianificazione può essere specificato quando il lavoro viene pianificato. Il lavoro verrà ritardato per il numero di millisecondi specificato prima della pianificazione.

   TrivialJob job = new TrivialJob();
   job.schedule(1000);  // wait one second before scheduling

Ripianificazione di un lavoro

La pianificazione di un lavoro già in attesa o interrotto non ha alcun effetto. Tuttavia, la pianificazione di un lavoro già in esecuzione fa in modo che il lavoro venga pianificato di nuovo una volta completato. Questo meccanismo è comodo per i lavori ripetitivi, ad esempio i cicli di polling di sfondo. Se il lavoro viene ripianificato più volte durante l'esecuzione, viene ripianificato solo una volta con il ritardo più recente. Il frammento di seguito riportato definisce un lavoro che viene ripianificato per essere eseguito 10 secondi dopo il completamento dell'iterazione corrente.

   class RepetitiveTrivialJob extends Job {
      public RepetitiveTrivialJob() {
         super("Repetitive Trivial Job");
      }
      public IStatus run(IProgressMonitor monitor) {
         System.out.println("Running the job.");
         // reschedule after 10 seconds
         schedule(10000);
         return Status.OK_STATUS;
      }
   }

Condizioni di pianificazione personalizzate

Un protocollo supplementare nella classe Lavoro consente ad un lavoro di verificare le precondizioni prima della pianificazione o dell'esecuzione. Ciò è dimostrato nell'esempio:

class JobWithPreconditions extends Job {
	...
	public boolean shouldSchedule() {
		return super.shouldSchedule() && checkJobPreconditions();
	}
	public boolean shouldRun() {
		return super.shouldRun() && checkJobPreconditions();
	}
	...
}

Il metodo shouldSchedule viene richiamato solo prima che il gestore lavori inserisce il lavoro nella coda. Ciò consente di annullare il lavoro se le precondizioni di base per la pianificazione non vengono rispettate. Se il lavoro restituisce il valore false, non è possibile pianificarlo. Allo stesso modo, il metodo shouldRun viene richiamato solo prima che il gestore lavori esegue il lavoro. Qualsiasi condizione supplementare che deve essere rispettata prima dell'esecuzione del lavoro deve essere verificata in questo momento.