Multi: Threading - это правильный подход? - PullRequest
7 голосов
/ 26 марта 2010

Эксперты -

Мне нужен совет в следующем сценарии.

У меня есть файл конфигурации со списком задач. Каждая задача может иметь ноль, одну или несколько зависимостей. Я хотел выполнить эти задачи параллельно [сейчас они выполняются последовательно]

Идея состоит в том, чтобы иметь основную программу для чтения файла конфигурации и загрузки всех задач. Прочитайте отдельные задачи и передайте их исполнителю [callable], который выполнит задачу и вернет результаты в будущем. Когда задача передается исполнителю (потоку), он будет отслеживать свои зависимости, чтобы сначала закончить и выполнить свою собственную задачу.

Это правильный подход? Есть ли другие лучшие подходы, использующие функции Java 1.5?

Ответы [ 5 ]

5 голосов
/ 26 марта 2010

Звучит нормально, но остерегайтесь Thread starvation deadlock. По сути, не используйте ограниченный пул потоков.

Вот пример, иллюстрирующий эту проблему.
http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java

Кроме того, если у вас есть, например, соединение с пулом БД, вы также можете столкнуться с проблемой. 10 потоков могут блокировать, удерживая все объединенное в пул соединение, ожидая 11-го потока, который не может получить 11-е объединенное в пул соединение, потому что его больше нет

3 голосов
/ 26 марта 2010

То, что вы описали , является подходом Java5 / 6.

Просто убедитесь, что ваши задачи / Callables являются потокобезопасными / не имеют общего состояния.

1 голос
/ 24 сентября 2011

На самом деле, вы делаете хотите многопоточность, когда стоимость запуска нескольких процессов высока.

Что, честно говоря, это почти все, что раскручивает копию JVM.

Чтобы ответить на OP, ANT может запускать задач параллельно, но НЕ целей параллельно. Таким образом, даже если у вас есть файл build.xml, который вы хотите изменить для параллельной работы, вам придется выполнить серьезную переписку. (Я думаю, что это было довольно странное дизайнерское решение, принятое разработчиками ANT, поскольку у вас уже есть график зависимостей, описанный самими целями.)

1 голос
/ 26 марта 2010

Активность в базе данных, архивирование и обработка правил идеально подходят для Ant (или даже Maven)

Не изобретай это заново. Просто используйте Ant.

Напишите Ant Tasks для каждой задачи. Определите зависимости в XML, используя правила зависимостей Ant.

Отключите Ant для запуска ваших задач на основе зависимостей. Вы можете начать с «исполняемых» задач Ant (http://ant.apache.org/manual/tasksoverview.html#exec)) вместо определения собственного подкласса Task.

Муравей понимает параллельные задачи. Вам не нужно ничего делать, кроме как объявить задачи параллельными. http://ant.apache.org/manual/Tasks/parallel.html

Не изобретайте новое программное обеспечение для этого. Используйте муравей.

1 голос
/ 26 марта 2010

Попробуйте использовать ValueFuture (из guava ) для связи между задачами. Добавьте слушателя к каждому ValueFuture, который отправляет новое задание на ExecutorService, только когда все его входы доступны. Таким образом, вы никогда не будете иметь блок потока на полпути через задачу, ожидающую завершения другой задачи.

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