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.
Ú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.