Simultaneidade e o espaço de trabalho

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.

Trabalhos de espaço de trabalho

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.