Ранее уже было отмечено, что код рабочей области должен учитывать возможность параллельной обработки, даже если она в нем не используются. Пакетные изменения рабочей области и изменение правил планирования применяются для совместного использования рабочей области с другими модулями (и их нитями), которые изменяют рабочую область. Если модуль использует пакетную обработку и правила (см. Пакетные изменения ресурсов), те же задачи можно выполнять, используя механизмы параллельной обработки.
Задание - это основная асинхронная операция. Задание выполняется параллельно с другими заданиями. Модуль ресурсов определяет метод 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();
Эта операция была создана как задание, и для нее можно использовать все стандартные механизмы планирования (приоритет, отложенное выполнение, перепланирование). События изменения ресурса будут группироваться до окончания выполнения задания.