到目前為止,我們的範例已經示範簡單的工作建立、排程和進度報告。實際的工作排程機制要比目前我們所告訴您的還要功能強大。您可以使用優先順序、延遲和自訂排程條件,更精細地控制工作的排程方式。
工作優先順序可以用來建立某項工作相對於系統中其他工作的重要性。設定工作的優先順序不會影響已經在執行的工作,但是會影響等待中的工作相對於其他工作的排程。工作的優先順序可以是數個預先定義的優先順序常數之一︰
工作的預設優先順序是 LONG。下列片段建立我們稍早使用過的簡單工作,但是將優先順序設為 DECORATE,表示這是最低層次的優先順序︰
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
控制工作排程方式的另一項技術是使用排程延遲。當工作在已排定時,可以指定排程延遲。在排定之前,工作將會延遲指定的毫秒數。
TrivialJob job = new TrivialJob(); job.schedule(1000); // 排程之前等待一秒
排程已經在等待或休眠中的工作是沒有效用的。但是,排程已在執行中的工作將會使該工作在完成之後重新排程。這對重複性工作(比如說,背景輪詢迴圈)而言是一項方便的機制。如果工作在執行中多次重新排程,只會以最近提供的延遲重新排程一次。下列片段定義一項工作,在工作完成現行疊代之後,重新排程本身執行 10 秒。
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Running the job."); // 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 方法。此時必須檢查工作執行前必須符合的任何其他條件。