Es wurde bereits dargestellt, dass der Arbeitsbereichscode auf gemeinsamen Zugriff achten muss, wenn er nicht das Gerüst für gemeinsamen Zugriff verwendet. Die Zusammenfassung von Arbeitsbereichsänderungen für den Stapelbetrieb und die Verwendung von Regeln für die Zeitplanung sind wichtige Elemente, wenn der Arbeitsbereich mit anderen Plug-ins (und ihren Threads) geteilt wird, die ebenfalls Änderungen durchführen. Nachdem Ihr Plug-in bereits Stapelbetrieb und Regeln verwendet (siehe Ressourcenänderungen für den Stapelbetrieb zusammenfassen), ist es nicht schwierig, dieselben Aufgaben über die Mechanismen der Plattform für den gleichzeitigen Zugriff auszuführen.
Ein Job ist eine Basiseinheit für asynchrone Verarbeitungsschritte, die gleichzeitig mit anderen Jobs ausgeführt werden kann. Das Ressourcen-Plug-in definiert WorkspaceJob als komfortable Methode zur Definition asynchroner Ressourcenänderungen. Code, der normalerweise zu einer ausführbaren Funktion IWorkspaceRunnable zusammengefasst werden würde, wird stattdessen in die Methode runInWorkspace des Subtyps des Arbeitsbereichsjobs eingesetzt. Anstatt den Code über das Protokoll IWorkspace auszuführen, wird der Job wie jeder andere Job terminiert. Bevor der Job terminiert werden kann, müssen zunächst die entsprechenden Regeln für die Zeitplanung zum Job hinzugeführt werden.
Im Folgenden wird dargestellt, wie eine ausführbare Arbeitsbereichsfunktion in einen Job umgewandelt werden kann:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
Die Arbeitsschritte werden zur geeigneten Methode des Subtyps WorkspaceJob versetzt.
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; } }
Die ausführbare Funktion wird gesondert aufgerufen:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Der Job wird wie jeder andere Job auch terminiert. Er wird vom Job-Manager der Plattform seiner Prioritätsstufe entsprechend ausgeführt, abhängig von anderen eingereihten Jobs und den Regeln für die Zeitplanung. Beachten Sie, dass wir die Regel für die Zeitplanung dem Job zuordnen müssen, damit myProject nicht simultan geändert wird.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Nachdem der Arbeitsgang als Job strukturiert wurde, können alle Mechanismen der Zeitplanung (Prioritätsstufe, Verzögerung, Neuterminierung) verwendet werden. Ressourcenänderungsereignisse werden für den Stapelbetrieb zusammengefasst, bis die Ausführung des Jobs beendet wurde.