Planowanie zadań

Przedstawione do tej pory przykłady ilustrowały tworzenie i planowanie prostych zadań oraz raportowanie postępu. Mechanizm planowania zadań oferuje jednak więcej możliwości, niż wynikałoby to z przedstawionych przykładów. Umożliwia uzyskanie precyzyjnej kontroli nad sposobem planowania zadań z uwzględnieniem priorytetów, opóźnień i niestandardowych warunków planowania.

Priorytety zadań

Za pomocą priorytetu zdania można określić istotność zadania względem innych zadań w systemie. Ustawienie priorytetu nie będzie miało wpływu na już uruchomione zadanie, ale ma wpływ na sposób planowania oczekującego zadania w odniesieniu do innych zadań. Priorytet zadania może być określony jedną z kilku predefiniowanych stałych:

Domyślny priorytet zadania to LONG. Przedstawiony poniżej fragment kodu tworzy proste zadanie, które było używane już we wcześniejszych przykładach, ale powoduje ustawienie priorytetu na DECORATE, wskazując najniższy poziom priorytetu:

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

Planowanie z opóźnieniem

Inna technika umożliwiająca określanie sposobu planowania zadania to planowanie z opóźnieniem. Opóźnienie można określić podczas planowania zadania. Zostanie ono wtedy opóźnione o określoną liczbę milisekund.

      TrivialJob job = new TrivialJob();
   job.schedule(1000);  // przed zaplanowaniem odczekanie jedną sekundę

Ponowne planowanie zadania

Planowanie zadania, które jest w stanie oczekiwania lub uśpienia, nie przyniesie żadnego efektu. Jednak zaplanowanie zadania, które jest już uruchomione, spowoduje jego ponowne zaplanowanie do wykonania po zakończeniu. Jest to wygodny mechanizm dla powtarzalnych zadań, takich jak pętle odpytywania w tle. Jeśli zadanie zostanie ponownie zaplanowane kilka razy podczas jego wykonywania, zostanie faktycznie zaplanowane do ponownego wykonania tylko raz, z ostatnim podanym odstępem. Poniższy fragment kodu definiuje zadanie, które samo planuje się do ponownego wykonania 10 sekund po zakończeniu bieżącej iteracji.

      class RepetitiveTrivialJob extends Job {
      public RepetitiveTrivialJob() {
         super("Repetitive Trivial Job");
      }
         public IStatus run(IProgressMonitor monitor) {
         System.out.println("Trwa wykonywania zadania.");
         // planowanie ponownego wykonania po 10 sekundach
         schedule(10000);
            return Status.OK_STATUS;
      }
   }

Niestandardowe warunki planowania

Dodatkowy protokół w klasie Job pozwala zadaniu sprawdzić warunki wstępne tuż przed jego zaplanowaniem lub wykonaniem. Najlepiej zilustruje to przykład:

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

Metoda shouldSchedule jest wywoływana tuż przed umieszczeniem zadania w kolejce przez menedżera zadań. Dzięki temu zadanie może się samo anulować, jeśli nie zostaną spełnione podstawowe warunki wstępne związane z planowaniem. Zadanie powinno zwrócić wartość false, jeśli zaplanowanie go nie jest właściwe. Podobnie metoda shouldRun jest wywoływana tuż przed wykonaniem zadania przez menedżera zadań. W tym czasie należy sprawdzić wszelkie dodatkowe warunki, które muszą zostać spełnione przed wykonaniem zadania.