Samtidighet og arbeidsområdet

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.

Arbeidsområdejobber

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.