Na předchozích příkladech jsme si již ukázali vytvoření jednoduché úlohy, plánování a vykazování průběhu. Mechanizmus plánování úloh je ve skutečnosti výkonnější, než jsme si zatím předvedli. Můžete jemněji ovládat způsob naplánování své úlohy za použití priorit, odkladů a vlastních plánovacích podmínek.
Prioritu úlohy lze využít ke stanovení důležitosti úlohy v porovnání s ostatními úlohami v systému. Nastavení priority úlohy neovlivní úlohu, která již probíhá, ale ovlivní způsob, jakým je čekající úloha naplánována ve vztahu k jiným úlohám. Priorita úlohy může nabývat jedné z několika předdefinovaných konstantních hodnot priority:
Výchozí prioritou úlohy je hodnota DLOUHÝ. Následující úsek kódu slouží k vytvoření triviální úlohy, kterou jsme již použili, ale nastavuje prioritu na hodnotu DEKORATIVNÍ, což znamená, že jde o úlohu s nejnižší úrovní důležitosti:
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Jinou technikou pro ovládání způsobu naplánování úlohy je použití plánovacího odkladu. Plánovací odklad lze zadat při plánování úlohy. Úloha bude pozdržena o uvedený počet milisekund a teprve potom bude naplánována.
TrivialJob job = new TrivialJob(); job.schedule(1000); // před naplánováním vyčkat jednu sekundu
Naplánování úlohy, která již čeká nebo je nečinná, nemá žádný účinek. Nicméně naplánováním úlohy, která již probíhá, dojde k tomu, že bude po svém dokončení přeplánována. Toto je pohodlný mechanizmus pro opakované úlohy, jako jsou např. smyčky výzev na pozadí. Pokud je úloha během spuštění vícekrát přeplánována, bude přeplánována pouze jednou s použitím posledně zadané prodlevy. Následující úsek kódu definuje úlohu, která se přeplánuje, aby se spustila 10 sekund po dokončení aktuální iterace.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Opakovaná triviální úloha"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Spuštění úlohy."); // přeplánovat ke spuštění po 10 sekundách schedule(10000); return Status.OK_STATUS; } }
Doplňkový protokol ve třídě Job umožňuje, aby úloha ověřila splnění předběžných podmínek těsně před naplánováním nebo spuštěním. To si můžeme nejlépe ukázat na následujícím příkladu:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
Metoda shouldSchedule se volá těsně předtím, než správce úloh zařadí úlohu do fronty. Díky tomu se úloha může zrušit, pokud nejsou splněny základní předběžné podmínky pro její naplánování. Úloha by měla vrátit hodnotufalse, což znamená, že není vhodné ji naplánovat. Podobně se volá metoda shouldRun těsně předtím, než správce úloh danou úlohu spustí. V tomto okamžiku se musí ověřit splnění všech dalších podmínek, které musí být splněny před spuštěním úlohy.