Accès concurrent et espace de travail

Nous avons déjà découverte que le code de l'espace de travail doit tenir compte de l'accès concurrent même s'il n'utilise pas la structure d'accès concurrent. Le regroupement des modifications de l'espace de travail et l'utilisation des règles de planification permet de partager l'espace de travail avec d'autres plug-ins (et leurs unités d'exécution) qui modifient l'espace de travail. Une fois que le plug-in utilise le regroupement et les règles (reportez-vous à la section Regroupement des modifications de ressources), il est facile d'effectuer le même travail à l'aide des mécanismes de d'accès concurrent de la plateforme.

Tâches de l'espace de travail

Une tâche est une unité de base de travail asynchrone exécutée parallèlement à d'autres tâches. Le plug-in de ressources définit WorkspaceJob comme un mécanisme pratique pour définir des modifications de ressource asynchrone. Le code qui serait normalement regroupé dans un protocole IWorkspaceRunnable, est placé dans la méthode runInWorkspace d'un sous-type de tâche d'espace de travail. Au lieu d'exécuter le code à l'aide du protocole IWorkspace, l a tâche est planifiée comme n'importe quelle autre tâche. Les règles de planification appropriées doivent être ajoutées à la tâche avant qu'elle soit planifiée.

Observez un exemple d'exécutable d'espace de travail et les éléments nécessaires pour en faire une tâche :

IWorkspaceRunnable myRunnable = 
new IWorkspaceRunnable() {
	        public void run(IProgressMonitor monitor) throws CoreException {
			// le travail véritable est effectué ici
			doSomeWork();
			...
		}
}

Le travail est déplacé vers la méthode appropriée du sous-type WorkspaceJob.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
			// le travail véritable est effectué ici
		doSomeWork();
		return Status.OK_STATUS;
	}
}

L'exécutable doit être appelé de manière spécifique :

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

La tâche est planifiée comme n'importe quelle autre tâche. Le gestionnaire de tâches de la plate-forme est exécuté en fonction de sa priorité, des autres tâches dans la file d'attente et des règles de planification. Notez que vous devez associer la règle de planification à la tâche afin d'empêcher une la modification simultanée de myProject.

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

Maintenant que l'opération a été structurée sous forme de tâche, tous les mécanismes de planification (priorité, délai, replanification) peuvent être utilisés. Les événements de modification des ressources seront regroupés jusqu'à ce que la tâche soit complètement exécutée.