これまでの例では、ジョブの単純な作成、スケジューリング、および進行状況のレポートについて説明しました。 ジョブのスケジュール・メカニズムは、実際には、これまでに説明したよりも強力なものです。 優先順位、遅延、およびカスタム・スケジュール条件を使用すると、ジョブのスケジュール方法をより細かく制御できます。
ジョブの優先順位 を使用すると、システム内の他のジョブに対する相対的な重要性をジョブに対して設定できます。 ジョブの優先順位を設定しても、既に実行されているジョブには影響がありませんが、 待機ジョブの他のジョブに対する相対的なスケジュール方法に影響を与えます。 ジョブの優先順位は、以下のいくつかの事前定義済み優先順位定数のいずれかにできます。
ジョブのデフォルトの優先順位は 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; } }
ジョブ・クラスの追加プロトコルにより、ジョブで、スケジュールまたは実行の直前に前提条件を検査できます。 このことは、例で確認すると最も良くわかります。
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
shouldSchedule メソッドは、ジョブがジョブ・マネージャーによってキューに入れられる直前に呼び出されます。 これにより、ジョブでは、スケジュールの基本的な前提条件が満たされていない場合に自身をキャンセルすることができます。 スケジュールするのに不適切な場合は、ジョブによって false が戻されるはずです。 同様に、shouldRun メソッドは、ジョブがジョブ・マネージャーによって実行される直前に呼び出されます。 ジョブの実行の前に満たしている必要のある追加の条件は、この時点で検査される必要があります。