2009-12-09 3 views
3

API рабочих мест в Eclipse RCP, по-видимому, работает намного по-другому, чем я ожидал. Я думал, что создание и планирование нескольких Джобсов фактически приведет к созданию нескольких рабочих потоков, выполняя задания параллельно, если не будет конфликт ISchedulingRule.Eclipse RCP: работает только одно задание?

Я вернулся и читать документацию более внимательно, а также обнаружил этот комментарий в классе JobManager:

/** 
* Returns a running or blocked job whose scheduling rule conflicts with the 
* scheduling rule of the given waiting job. Returns null if there are no 
* conflicting jobs. A job can only run if there are no running jobs and no blocked 
* jobs whose scheduling rule conflicts with its rule. 
*/ 

Теперь он смотрит на меня как менеджер Работа будет только когда-либо пытаться использовать один фон рабочий поток. Неужели я совершенно не прав? Если я прав,

  • Какая точка планирования правил и блокировок? Если есть только один рабочий поток, Джобс никогда не сможет обойти друг друга. Разве они не будут использоваться только в случае вызова метода Job sleep() (например, спящего при удерживании блокировки)?
  • делает любую часть платформы, позволяя двум рабочим заданиям фактически работать одновременно, на нескольких рабочих потоках, тем самым делая вышеуказанные функции полезными как-то?

Что мне здесь не хватает?

ответ

2

Взгляните на метод выполнения в documentation, а именно эта часть:

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

ASYNC_FINISH там выглядит interresting.

+0

Будет ли менеджер работа по-прежнему обеспечивать соблюдение правил планирования для заданий, оканчивающих асинхронно? Я надеюсь, что это так (и я полагаю, что это то, что делает call done()), но я хотел бы быть уверенным. –

+0

Я не думаю, что это решение. У меня только две рабочие задачи, и я вообще не использую async_finish. Не имеет никакого смысла, потому что «простые» задания уже запускаются в собственной нити! – Zordid

0

Это Eclipse Corner article содержит хорошее описание, а также несколько примеров кода для Eclipse Job API. API IJobManager необходим только для расширенных манипуляций с работой, например. когда вам нужно использовать блокировки, синхронизировать между несколькими заданиями, прекратить работу и т. д.

1

AFAIK, создавая и планируя несколько заданий, действительно вызывает создание нескольких рабочих потоков и их выполнение параллельно. Однако, если вы указываете необязательное правило планирования для своего задания (используя метод setRule()), и если это правило конфликтует с правилом планирования другого задания, эти два задания не могут выполняться одновременно.

0

Примечание: Затмение 4.5M4 будет включать в себя в настоящее время (Q4 2014) способ поддержки для групп Job с дросселированием

См bug 432049:

Eclipse, обеспечивает простую работу API для выполнения различных задач параллельно и в асинхронном режиме. Одно из ограничений Eclipse Jobs заключается в том, что нет простого способа ограничить количество рабочих потоков, используемых для выполнения заданий.
Это может привести к взрыву пула потоков, когда многие задания запланированы в быстрой последовательности.Из-за этого легко использовать Джобс для одновременного выполнения разных несвязанных задач, но трудно реализовать тысячи рабочих мест для совместной работы для выполнения одной большой задачи.

Eclipse в настоящее время поддерживает концепцию Job Families, которая обеспечивает один способ группировки с поддержкой операций объединения, отмены, сна и пробуждения для всей семьи.

Чтобы решить все эти проблемы, мы хотели бы предложить простой способ сгруппировать набор закладок Eclipse, которые отвечают за части одной и той же большой задачи.
API будет поддерживать дросселирование, объединение, отмену, комбинированный прогресс и отчетность об ошибках для всех заданий в группе, а функциональность группировки заданий может использоваться для перезаписи критически важных алгоритмов для использования параллельного выполнения сотрудничающих заданий.

Вы можете увидеть реализацию в this commit 26471fa

Смежные вопросы