並行性およびワークスペース

ワークスペース・コードは、並行性フレームワークを使用しない場合でも、並行性を認識する必要があることについては、すでに説明しました。 ワークスペース変更のバッチおよびスケジュール・ルールの使用は、ワークスペースを変更する他のプラグイン (およびそのスレッド) とのワークスペースの共有に役立ちます。 プラグインがバッチとルールを使用していると (『リソース変更のバッチ』を参照)、プラットフォーム並行性メカニズムを使用して同じ作業を簡単に実行することができます。

ワークスペース・ジョブ

ジョブとは、その他のジョブと並行して実行されている非同期作業の基本単位のことです。 リソース・プラグインは、非同期リソース変更を定義する便利なメカニズムとして、WorkspaceJob を定義します。 通常 IWorkspaceRunnable にバッチされるコードは、代わりにワークスペース・ジョブ・サブタイプの runInWorkspace メソッドに書き込まれます。IWorkspace プロトコルを使用してコードを実行する代わりに、このジョブが他のジョブと同様にスケジュールされます。 ジョブは、適切なスケジュール・ルールが追加されてからスケジュールされる必要があります。

ワークスペース実行可能コードのサンプルを使用して、ジョブにするために行うべきことを確認します。

IWorkspaceRunnable myRunnable =
	new IWorkspaceRunnable() {
		public void run(IProgressMonitor monitor) throws CoreException {
			//do the actual work in here
			doSomeWork();
			...
		}
}

作業は、WorkspaceJob サブタイプの適切なメソッドに移動します。

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
		//do the actual work in here
		doSomeWork();
		return Status.OK_STATUS;
	}
}

この実行可能コードは、明示的に呼び出す必要があります。

IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);

このジョブは、他のジョブと同様にスケジュールされます。 プラットフォーム・ジョブ・マネージャーは、優先順位、キュー内の他のジョブ、スケジュール・ルールに従ってジョブを実行します。myProject が同時に変更されないようにするために、ジョブにスケジュール・ルールを添付する必要があります。

MyWorkspaceJob job = new MyWorkspaceJob();
job.setRule(myProject);
job.schedule();

これで、操作がジョブとして構造化され、すべてのスケジュール・メカニズム (優先順位、遅延、スケジュール変更) を使用できます。ジョブの実行が完了するまで、リソース変更イベントがバッチされます。