Приведенные выше примеры иллюстрировали создание, планирование заданий и отчет о состоянии их выполнения. Механизм планирования заданий на самом деле гораздо мощнее, чем было показано до сих пор. Можно обеспечить более точное управление заданием, если планировать его с использованием приоритетов, задержек и пользовательских условий планирования.
Приоритет задания служит для установки важности задания по отношению к другим заданиям в системе. Установка приоритета не влияет на выполняющееся задание, но повлияет на то, как ждущее задание запланируется по отношению к другим заданиям. Приоритет задания может быть одной из нескольких предопределенных констант:
По умолчанию для задания устанавливается приоритет LONG. В следующем фрагменте кода создается простое задание, как и в предыдущем примере, но для него устанавливается приоритет DECORATE - самый низкий:
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Еще один способ проконтролировать, как запланировано задание - задержка планирования. Задержку планирования можно указать при планировании задания. Выполнение задания будет отложено на указанное количество миллисекунд после его постановки в очередь.
TrivialJob job = new TrivialJob(); job.schedule(1000); // подождать 1 секунду перед планированием
Планировать ждущее или спящее задание бесполезно. Однако, планирование выполняющегося задания приведет к повторному планированию после завершения выполнения. Этот прием подходит для повторяющихся заданий, например, для фонового циклического опроса. Если во время выполнения запланировать задание несколько раз, то силу будет иметь только одно планирование - с самой последней задержкой. В следующем фрагменте кода определяется задание, которое самопланируется так, чтобы запуститься через 10 секунд после завершения текущего выполнения.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Запуск задания."); // повторное планирование через 10 секунд schedule(10000); return Status.OK_STATUS; } }
Для того, чтобы задание перед планированием или запуском проверяло предварительные условия, служит дополнительный протокол класса Job. Лучше всего пояснить это на примере:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
Перед тем, как диспетчер заданий поместит задание в очередь, вызывается метод shouldSchedule. Он позволяет заданию отменяться, если не выполняются основные предварительные условия. Задание должно вернуть false, что говорит о том, что это задание нельзя запланировать. Аналогично, перед тем, как диспетчер заданий запустит задание, вызывается метод shouldRun. В нем проверяются все условия, которые должны выполняться для запуска задания.