Multi:Threading - Действительно ли это - правильный подход?

Эксперты -

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

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

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

Действительно ли это - правильный подход? Там какие-либо другие лучшие подходы используют функции java 1.5?

7
задан jagamot 26 March 2010 в 15:22
поделиться

4 ответа

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

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

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

5
ответ дан 6 December 2019 в 23:04
поделиться

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

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

3
ответ дан 6 December 2019 в 23:04
поделиться

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

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

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

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

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

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

1
ответ дан 6 December 2019 в 23:04
поделиться

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

1
ответ дан 6 December 2019 в 23:04
поделиться