Параллельное выполнение и рабочая среда

Ранее уже было отмечено, что код рабочей области должен учитывать возможность параллельной обработки, даже если она в нем не используются. Пакетные изменения рабочей области и изменение правил планирования применяются для совместного использования рабочей области с другими модулями (и их нитями), которые изменяют рабочую область. Если модуль использует пакетную обработку и правила (см. Пакетные изменения ресурсов), те же задачи можно выполнять, используя механизмы параллельной обработки.

Задания рабочей области

Задание - это основная асинхронная операция. Задание выполняется параллельно с другими заданиями. Модуль ресурсов определяет метод WorkspaceJob как удобный механизм для определения асинхронных модификаций ресурсов. Код, который обычно входит в метод IWorkspaceRunnable, помещается в метод runInWorkspace производного типа задания рабочей области. Вместо выполнения исходного кода с помощью протокола IWorkspace, это задание планируется как любое другое задание. Перед планированием в задание необходимо добавить соответствующие правила планирования.

Рассмотрим, как создается задание, на примере объекта runnable:

IWorkspaceRunnable myRunnable = 
	new IWorkspaceRunnable() {
		public void run(IProgressMonitor monitor) throws CoreException {
			//собственно алгоритм
			doSomeWork();
			...
		}
}

Алгоритм переносится в соответствующий метод производного класса WorkspaceJob.

class MyWorkspaceJob extends WorkspaceJob {
	public MyWorkspaceJob() {
		super("My Workspace Job");
	}
	public IStatus runInWorkspace(IProgressMonitor monitor) {
		//собственно алгоритм
		doSomeWork();
		return Status.OK_STATUS;
	}
}

Вызов объекта runnable осуществляется явным образом:

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

Задание ставится в очередь, как любое другое задание. Администратор заданий выполняет это задание в соответствии с его приоритетом, наличием других заданий в очереди и правилами планирования. Следует отметить, что правило планирования необходимо присоединить к заданию, чтобы исключить возможность одновременной модификации myProject.

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

Эта операция была создана как задание, и для нее можно использовать все стандартные механизмы планирования (приоритет, отложенное выполнение, перепланирование). События изменения ресурса будут группироваться до окончания выполнения задания.