並行和工作區

我們已經看到工作區程式碼必須注意並行性,即使沒有使用並行組織架構。工作區變更的批次作業和使用排程規則有助於和其他會修改工作區的外掛程式(及其執行緒)共用工作區。當您的外掛程式使用了批次作業和規則(請參閱批次資源變更),就能很容易地使用平台並行機制來執行相同的工作。

工作區工作

工作是非同步工作與其他工作並行執行的基本單位。資源外掛程式定義 WorkspaceJob, 這是對定義非同步資源修改很方便的機制。通常在 IWorkspaceRunnable 中批次處理的程式碼,會改放在工作區工作子類型的 runInWorkspace 方法。利用與其他工作相似的工作排程,取代使用 IWorkspace 通訊協定執行程式碼。 在工作排程之前,工作必須加入適當的排程規則。

讓我們看看範例工作區 Runnable 以及要做哪些事情才能讓它成為工作:

IWorkspaceRunnable myRunnable = 
	new IWorkspaceRunnable() {
 	        public void run(IProgressMonitor monitor) throws CoreException {
			//在這裡執行實際的工作
			doSomeWork();
			...
		}
}

工作移動到我們的 WorkspaceJob 子類型的適當方法。

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
			//在這裡執行實際的工作
		doSomeWork();
		return Status.OK_STATUS;
	}
}

我們的 Runnable 必須被指定呼叫:

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

我們的工作排程與其他工作相似。平台工作管理程式將會根據其優先順序、佇列中的其他工作以及排程規則來執行工作。請注意,我們必須將排程規則附加到工作上,才能防止同時修改 myProject

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

請注意,作業已經被結構化成為工作,可以使用所有的排程機制(優先順序、延遲、重新排程)。資源變更事件將會批次作業,直到工作完成執行為止。