Vi har allerede sett at arbeidsområdekode må ta hensyn til samtidighet, selv om det samtidige rammeverket ikke brukes. Satsvis kjøring av endringer i arbeidsområdet og bruk av planleggingsregler bidrar til å dele arbeidsområdet med andre plugin-moduler (og deres tråder) som endrer arbeidsområdet. Når plugin-modulen bruker satsvis kjøring og regler (se Satsvis kjøring av ressursendringer), er det enkelt å utføre samme arbeid med plattformens funksjonalitet for samtidighet.
En jobb er en grunnleggende enhet med asynkront arbeid som kjører samtidig med andre jobber. Plugin-modulen for ressurser definerer WorkspaceJob som en praktisk mekanisme for å definere asynkrone ressursendringer. Kode som vanligvis bearbeides i en IWorkspaceRunnable, legges i stedet i metoden runInWorkspace for en jobbsubtype for et arbeidsområde. I stedet for å kjøre koden ved hjelp av IWorkspace-protokollen, er jobben planlagt som alle andre jobber. Det må legges til riktige planleggingsregler i jobben før den planlegges.
La oss se på et eksempel på en arbeidsområdekjørefil og hva vi må gjøre for å gjøre den til en jobb:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
Arbeidet flyttes til den egnede metoden i subtypen 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; } }
Den kjørbare filen må kalles spesifikt:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Jobben planlegges på samme måte som andre jobber. Plattformens jobbstyrer kjører jobben etter prioritet, andre jobber i køen og planleggingsreglene. Merk at vi må knytte planleggingsreglene til jobben for å hindre samtidig endring av myProject.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Nå som operasjonen er strukturert som en jobb, kan alle planleggingsmekanismer (prioritet, forsinkelse og ny planlegging) brukes. Ressursendringshendelser kjøres satsvist til jobben har kjørt ferdig.