задачи проектирования Java в параллельном механизме - PullRequest
1 голос
/ 16 января 2009

Я придумываю дизайн для многопоточной системы Java 1.5, основанной на задачах.

Задачи обычно взаимодействуют с коллекцией для определения неудачных или успешных событий совпадения. Исходя из результата, другая задача может быть поставлена ​​в очередь для операций ввода-вывода, чтобы информировать клиентов и / или хранить важную информацию о транзакции.

Java предоставляет богатый набор параллельных инструментов для пулов потоков и управления задачами, но я пытаюсь придумать лучший дизайн для самих задач.

Например: должна ли каждая задача иметь ссылку на коллекцию? Как должна быть инициализирована задача? и т.д ...

Знает ли кто-нибудь о хороших примерах кодирования или каких-либо ссылках, которые иллюстрируют некоторые из различных возможностей дизайна.

Ответы [ 2 ]

3 голосов
/ 17 января 2009

Любой, кто пытается сделать многопоточность в Java, должен прочитать «Практический параллелизм Java» Брайана Гетца .

Вы не должны пытаться делать это с любым JDK ниже версии 5. Именно тогда впервые появились пакеты java.util.concurrent.

0 голосов
/ 18 января 2009

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

Другой вариант - дать каждой задаче необходимые входные данные, дать ей возможность вычислить результат и затем обработать результаты. Это может быть сделано параллельно или нет, в зависимости от ваших потребностей.

Вы обязательно должны использовать ExecutorService в любом случае, поскольку он позволяет объединять пул потоков и очередь запросов, где потоки будут извлекать и выполнять задачи по мере необходимости. CompletionService также может добавить очередь результатов, если это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...