Souběžnost a pracovní prostor

Již jsme viděli, že kód pracovního prostoru musí zohledňovat souběžnost, i když sám prostředí souběžnosti nepoužívá. Dávkové zpracování změn pracovního prostoru a použití pravidel plánování pomáhá při sdílení pracovního prostoru s ostatními moduly plug-in (a jejich vlákny), které pracovní prostor upravují. Jakmile váš plug-in používá dávkové zpracování a pravidla (viz Dávkové zpracování změn prostředků), je snadné provést tutéž práci pomocí mechanizmů souběžnosti poskytovaných platformou.

Úkoly pracovního prostoru

Úkol je základní jednotka asynchronní práce prováděná souběžně s ostatními úkoly. Plug-in prostředků definuje nadstavbový mechanizmus pro definování asynchronních úprav prostředků WorkspaceJob. Kód, který by byl normálně vložen do dávky v IWorkspaceRunnable, se místo toho vloží do metody runInWorkspace podtypu úkolu pracovního prostoru. Místo aby byl tento kód proveden pomocí protokolu IWorkspace, je naplánován jako kterýkoli jiný úkol. Před naplánováním je třeba k úkolu přidat příslušná pravidla plánování.

Podívejme se na příklad procesu runnable pracovního prostoru a na to, jak z něj udělat úkol:

IWorkspaceRunnable myRunnable = 
	new IWorkspaceRunnable() {
		public void run(IProgressMonitor monitor) throws CoreException {
			//tady uvnitř provést skutečnou práci
			doSomeWork();
			...
		}
}

Práce je přesunuta do odpovídající metody našeho podtypu WorkspaceJob.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("Můj úkol pracovní plochy");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
			//tady uvnitř provést skutečnou práci
		doSomeWork();
		return Status.OK_STATUS;
	}
}

Náš proces runnable musí být vyvolán výslovně:

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

Náš úkol je naplánován jako jakýkoli jiný úkol. Správce úkolů platformy spustí úkol v závislosti na jeho prioritě, dalších úkolech ve frontě a pravidlech plánování. Uvědomte si, že k úkolu musíme připojit pravidlo plánování, abychom předešli současným úpravám projektu myProject.

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

Nyní, když byla operace strukturovaná jako úkol, je možné použít všechny plánovací mechanizmy (priorita, odklad, přeplánování). Události změn prostředků budou ukládány do dávek, dokud neskončí běh úkolu.