Ya hemos visto que el código del espacio de trabajo debe tener conocimiento de la concurrencia aunque no utilice la infraestructura de concurrencia. La agrupación en lotes de los cambios del espacio de trabajo y la utilización de normas de planificación ayuda a compartir el espacio de trabajo con otros plug-ins (y sus hebras) que están modificando el espacio de trabajo. Una vez que el plug-in está utilizando la agrupación por lotes y las normas (consulte la sección Agrupación por lotes de los cambios de recursos), es fácil realizar el mismo trabajo utilizando los mecanismos de concurrencia de la plataforma.
Un trabajo es una unidad básica de trabajo asíncrono que se ejecuta de manera concurrente a otros trabajos. El plug-in de recursos define WorkspaceJob como mecanismo de conveniencia para definir modificaciones asíncronas de recursos. El código que generalmente se agruparía por lotes en un IWorkspaceRunnable se coloca en el método runInWorkspace de un subtipo de trabajo de espacio de trabajo. En lugar de ejecutar el código utilizando el protocolo IWorkspace, el trabajo se planifica igual que cualquier otro. Deben añadirse al trabajo las normas de planificación adecuadas antes de planificarlo.
Observemos un ejemplo de ejecutable de espacio de trabajo y lo que debe hacerse para convertirlo en un trabajo:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //realizar aquí el trabajo real doSomeWork(); ... } }
El trabajo se traslada al método adecuado del subtipo WorkspaceJob.
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("Mi trabajo de espacio de trabajo"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //realizar aquí el trabajo real doSomeWork(); return Status.OK_STATUS; } }
El ejecutable debía invocarse específicamente:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
Nuestro trabajo se planifica igual que cualquier otro. El gestor de trabajos de la plataforma lo ejecutará de acuerdo con su prioridad, con los demás trabajos de la cola y con las normas de planificación. Tenga en cuenta que debemos asociar la norma de planificación al trabajo para evitar la modificación simultánea de myProject.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
Ahora que la operación se ha estructurado como un trabajo, pueden utilizarse todos los mecanismos de planificación (prioridad, retardo, replanificación). Los eventos de cambio de recurso se agruparán por lotes hasta que el trabajo finalice.