作业调度

到目前为止,我们的示例演示了简单的作业创建、调度和进度报告。作业调度机制实际上比我们到目前为止所显示的功能更强大。可以通过使用优先级、延迟和定制调度条件来对调度作业的方式进行更细粒度的控制。

作业优先级

作业优先级可以用来确定一个作业相对于系统中的其它作业的重要性。设置作业的优先级将不影响已经在运行的作业,但是它会影响正在等待的作业相对于其它作业的调度顺序。作业的优先级可以是预定义的几个优先级常量的其中一个:

作业的缺省优先级是 LONG。以下片段将创建我们先前使用的普通作业,但是会将优先级设置为 DECORATE 以指示它是最低级别的优先级:

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

具有延迟的调度

这是用于控制如何调度作业以使用调度延迟的另一种技术。可以在调度作业时指定调度延迟。在调度作业之前,作业将延迟指定的毫秒数。

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

重新调度作业

调度已经在等待或者休眠的作业没有任何效果。但是,调度已经在运行的作业将导致在完成该作业之后重新调度它。对于重复的作业(例如,后台轮询循环)来说,这是一种很方便的机制。如果作业在运行时被多次重新调度,则它将只按照最近提供的延迟重新调度一次。以下片段定义一个作业,当它完成当前迭代之后,它将重新调度它自己运行 10 秒种。

      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;
      }
   }

定制调度条件

Job 类中的附加协议允许作业就在调度或运行它之前检查先决条件。以下示例清楚地说明了这一点:

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

shouldSchedule 方法是刚好在作业管理器将作业置于队列中之前调用的。如果不满足调度的基本先决条件,这允许作业取消它自己。作业应该返回 false,不合适调度它。类似地,shouldRun 方法是刚好在作业管理器运行作业之前调用的。此时,必须检查在作业运行之前必须满足的任何其它条件。