W poprzednich sekcjach pokazano, że obszar roboczy musi uwzględniać współbieżność, nawet jeśli struktura współbieżna nie jest używana. Zmienianie obszaru roboczego metodą wsadową oraz używanie reguł planowania pomaga we współużytkowaniu obszaru roboczego przez inne moduły dodatkowe (i ich wątki), które dokonują w nim zmian. Gdy moduł dodatkowy używa już obsługi wsadowej oraz reguł (patrz sekcja Zmienianie zasobów metoda wsadową), łatwo jest wykonać tą samą pracę przy użyciu mechanizmów współbieżności platformy.
Job (zadanie) jest podstawową jednostką pracy asynchronicznej wykonywaną współbieżnie z innymi zadaniami. Moduł dodatkowy zasobów definiuje klasę WorkspaceJob jako wygodny mechanizm definiowania asynchronicznych modyfikacji zasobów. Kod, który normalnie zostałby zgrupowany w interfejsie IWorkspaceRunnable, jest umieszczany jako podtyp zadania obszaru roboczego w metodzie runInWorkspace. Zamiast uruchamiać kod przy użyciu protokołu IWorkspace, zadanie jest planowane, jak każde inne. Odpowiednie reguły planowania muszą zostać dodane do zadania przed jego zaplanowaniem.
Przyjrzyjmy się przykładowemu elementowi wykonywalnemu i zobaczmy, co należy z nim zrobić, aby stał się zadaniem:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //tu jest wykonywana właściwa praca doSomeWork(); ... } }
Praca została przeniesiona do odpowiedniej metody podtypu WorkspaceJob.
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("My Workspace Job"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //tu jest wykonywana właściwa praca doSomeWork(); return Status.OK_STATUS; } }
Element wykonywalny musiał zostać wywołany w specjalny sposób:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Zadanie zostało zaplanowane, jak każde inne. Menedżer zadań platformy uruchomi zadanie zgodnie z jego priorytetem, innymi zadaniami w kolejce oraz regułami planowania. Należy zwrócić uwagę, że reguła planowania musi zostać dodana do zadania, aby zapobiec równoległym modyfikacjom elementu myProject.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Gdy operacja uzyskała już strukturę zadania, można skorzystać ze wszystkich mechanizmów planowania (priorytet, opóźnienie, zmiana harmonogramu). Zdarzenia związane ze zmianami w zasobach będą zgrupowane do czasu zakończenia działania zadania.