Vi har redan sett att arbetsytekoden måste vara medveten om samtidighet även om den inte använder samtidighetsramverket. Batchbearbetning av arbetsyteändringar och användning av schemalagda regler hjälper till att bidra med andra insticksprogram (och deras trådar) till arbetsytan som modifierar den. När ditt insticksprogram använder batchbearbetning och regler (se Batchbearbeta resursändringar), är det enkelt att utföra samma arbeta med plattformens samtidighetsmekanismer.
Ett jobb är en basenhet av asynkront arbete som körs samtidigt med andra jobb. Resursernas insticksprogram definierar WorkspaceJob som en praktiskt mekanism för definiering av asynkrona resursmodifieringar. Kod som normalt skulle batchbearbetas i en IWorkspaceRunnable läggs istället i metoden runInWorkspace i en jobbundertyp på arbetsytan. Istället för att köra koden med protokollet IWorkspace, schemaläggs jobbet precis som ett annat jobb. Rätt schemaläggningsregler måste läggas till i jobbet innan det schemaläggs.
Låt oss ta en titt på ett exempel på en arbetsytekörfil och vad som krävs för att göra den till ett jobb:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
Arbetet flyttas till rätt metod i vår WorkspaceJob-undertyp.
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; } }
Vår körfil måste anropas specifikt:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Vårt jobb schemaläggs precis som ett annat jobb. Plattformens jobbhanterare kör det enligt dess prioritet, andra jobb i kön och schemaläggningsreglerna. Lägg märke till att vi måste koppla schemaläggningsregeln till jobbet för att förhindra samtidig ändring av myProject.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Nu när åtgärden har strukturerats som ett jobb kan alla schemaläggningsmekanismerna (prioriter, fördröjning, schemaomläggning) användas. Resursändringshändelser batchbearbetas tills jobbet är slutfört.