Simultaneità e spazio di lavoro

È stato illustrato come il codice dello spazio di lavoro deve essere consapevole della simultaneità anche se non utilizza il framework della simultaneità. Il batch delle modifiche dello spazio di lavoro e l'utilizzo delle regole di pianificazione consentono di condividere lo spazio di lavoro con altri plugin (e relativi thread) che modificano lo spazio di lavoro. Una volta che il plugin utilizza il batch e le regole (fare riferimento alla sezione Batch delle modifiche delle risorse), è semplice eseguire lo stesso lavoro utilizzando i meccanismi di simultaneità della piattaforma.

Lavori dello spazio di lavoro

Un lavoro è un'unità base di lavoro asincrono eseguito insieme ad altri lavori. Il plugin delle risorse definisce il protocollo WorkspaceJob come un meccanismo utile per la definizione delle modifiche delle risorse asincrone. Il codice di cui viene in genere eseguito il batch in un metodoIWorkspaceRunnable viene al contrario inserito nel protocollo runInWorkspace di un sottotipo di lavoro dello spazio di lavoro. Anziché eseguire il codice utilizzando il protocollo IWorkspace, il lavoro viene pianificato come qualsiasi altro lavoro. Le regole di pianificazione appropriate devono essere aggiunte al lavoro prima che venga pianificato.

Di seguito viene riportato uno spazio di lavoro eseguibile di esempio, insieme alle operazioni da eseguire per rendere lo spazio di lavoro un lavoro:

IWorkspaceRunnable myRunnable = 
new IWorkspaceRunnable() {
	        public void run(IProgressMonitor monitor) throws CoreException {
			//do the actual work in here
			doSomeWork();
			...
		}
}

Il lavoro viene spostato nel metodo appropriato del sottotipo 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;
	}
}

Lo spazio di lavoro eseguibile deve essere richiamato in modo specifico:

IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);

Il lavoro viene pianificato come qualsiasi altro lavoro. Il gestore lavori della piattaforma eseguirà il lavoro in base alla relativa priorità, agli altri lavori presenti nella coda e alle regole di pianificazione. Per evitare modifiche simultanee di myProject, è necessario collegare la regola di pianificazione al lavoro.

MyWorkspaceJob job = new MyWorkspaceJob();
job.setRule(myProject);
job.schedule();

L'operazione è stata strutturata come un lavoro, tutti i meccanismi di pianificazione (priorità, ritardo e ripianificazione) possono essere utilizzati. Verrà eseguito il batch degli eventi di modifica delle risorse, fino a quando l'esecuzione del lavoro non sarà stata completata.