Já vimos que o código do espaço de trabalho deve ter em mente a simultaneidade mesmo que não esteja a utilizar o mesmo quadro de simultaneidade. A constituição de lotes de alterações ao espaço de trabalho e de regras de agendamento ajuda a partilhar o espaço de trabalho com outros plug-ins (e respectivos módulos) que modifiquem o mesmo. Uma vez que o plug-in utilize lotes e regras (consulte Constituir lotes de alterações a recursos), será fácil realizar o mesmo trabalho com os mecanismos de simultaneidade da plataforma.
Um Trabalho é uma unidade básica de trabalho assíncrono executada simultaneamente com outros trabalhos. O plug-in de recursos define o WorkspaceJob como mecanismo conveniente para definir modificações de recursos assíncronas. O código que estaria normalmente num lote num IWorkspaceRunnable é colocado no método runInWorkspace de um subtipo de trabalho de espaço de trabalho. Em vez de executar o código com o protocolo IWorkspace, o trabalho é agendado como qualquer outro. Devem ser adicionadas ao trabalho as regras de agendamento apropriadas antes de o mesmo ser agendado.
vejamos um exemplo de executável de espaço de trabalho e o que se deve fazer para constituir um trabalho:
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
O trabalho é movido para o método apropriado do nosso subtipo de WorkspaceJob.
class oMeuTrabalhoEspaçoTrabalho extends WorkspaceJob { public oMeuTrabalhoEspaçoTrabalho() { super("O Meu Trabalho de Espaço de Trabalho"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //do the actual work in here doSomeWork(); return Status.OK_STATUS; } }
O nosso executável teve que ser invocado especificamente:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(oMeuExecutável, oMeuProjecto, IWorkspace.AVOID_UPDATE, null);
O nosso trabalho está agendado como qualquer outro. O gestor de trabalhos da plataforma será executado segundo as suas prioridades, outros trabalhos em fila, e as regras de agendamento. Repare que temos de anexar a regra de agendamento ao trabalho a fim de impedir modificações simultâneas de oMeuProjecto.
oMeuTrabalhoEspaçoTrabalho job = new oMeuTrabalhoEspaçoTrabalho(); job.setRule(oMeuProjecto); job.schedule();
Agora que a operação foi estruturada como trabalho, podem ser utilizados todos os mecanismos de agendamento (prioridade, diferimento, reagendamento). Os eventos de alteração de recursos ficarão em lotes até o trabalho terminar de executar.