Nossos exemplos até agora demonstraram a criação de tarefas simples, planejamento e relatório de progresso. O mecanismo de planejamento da tarefa é, na verdade, mais poderoso do mostramos até agora. Você pode ter mais controle sobre a maneira como sua tarefa é planejada, utilizando prioridades, retardos e personalização de condições de planejamento.
Uma tarefa priority pode ser utilizada para estabelecer a importância de uma tarefa em relação a outras tarefas no sistema. Configurar a prioridade de uma tarefa não afetará uma tarefa que já está em execução, mas afetará como uma tarefa em espera é planejada em relação às outras tarefas. A prioridade de uma tarefa pode ser uma das várias constantes da prioridade predefinida:
A prioridade padrão para uma tarefa é LONG. O seguinte fragmento cria a tarefa trivial que utilizamos anteriormente, mas define a prioridade para DECORATE para indicar que é o menor nível de prioridade:
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Outra técnica para controlar como uma tarefa é planejada é utilizar um retardo de planejamento. Um retardo de planejamento pode ser especificado quando a tarefa é planejada. A tarefa será retardada para o número especificado de milissegundos antes de ser planejada.
TrivialJob job = new TrivialJob(); job.schedule(1000); // wait one second before scheduling
Planejar uma tarefa que já está aguradando ou em espera não faz efeito. Entretanto, planejar uma tarefa que já está em execução fará com que ela seja replanejada depois de ser concluída. Este é um mecanismo conveniente para tarefas repetitivas como loops de polling de segundo plano. Se a tarefa é replanejada várias vezes enquanto está em execução, ela será replanejada somente uma vez com o retardo fornecido mais recentemente. O seguinte fragmento define uma tarefa que se replaneja para ser executada 10 segundos depois da conclusão da iteração atual.
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; } }
O protocolo adicional na classe Tarefa permite que uma tarefa verifique as pré-condições antes de ser planejada ou executada. Isso é demonstrado melhor pelo exemplo:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
O método shouldSchedule é chamado antes que o gerenciador de tarefas coloque a tarefa na fila. Isso permite que a tarefa se cancele se as pré-condições básicas para planejamento não são encontradas. A tarefa deve retornar false e não é apropriado para planejá-lo. Do mesmo modo, o método shouldRun é chamado antes que o gerenciador de tarefa executa a tarefa. As condições adicionais que devem ser encontradas antes que a tarefa seja executada devem ser verificadas neste momento.