Эксперты -
Мне нужен некоторый совет в следующем сценарии.
У меня есть конфигурационный файл со списком задач. Каждая задача может иметь нуль, одну или несколько зависимостей. Я хотел выполнить эти задачи параллельно [прямо сейчас, они выполняются последовательно]
Идея состоит в том, чтобы иметь основную программу, чтобы считать конфигурационный файл и загрузить все задачи. Считайте отдельные задачи и дайте его исполнителю [вызываемому], который выполнит задачу и возвратит результаты в будущем. Когда задача будет отправлена исполнителю (поток), это будет контролировать для его зависимостей, чтобы прийти первым и выполнить его собственную задачу.
Действительно ли это - правильный подход? Там какие-либо другие лучшие подходы используют функции java 1.5?
Звучит нормально, но остерегайтесь тупика из-за отсутствия потоков
. По сути, не используйте ограниченный пул потоков.
Вот пример, иллюстрирующий эту проблему.
http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java
Кроме того, если у вас, например, соединение с объединенной БД, вы тоже можете столкнуться с проблемой.10 потоков могут блокироваться, удерживая все объединенные соединения, ожидая 11-го потока, который не может получить 11-е объединенное соединение, потому что оно больше не доступно ..
То, что вы описали , является подходом Java5 / 6.
Просто убедитесь, что ваши задачи / Callables являются потокобезопасными / не разделяют состояние.
Работа с базами данных, архивирование и обработка правил - идеальное применение 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.
Рассмотрите возможность использования ValueFuture (из guava ) для связи между задачами. Добавьте слушателя к каждому ValueFuture
, который отправляет новую задачу в ExecutorService
, только когда все его входные данные доступны. Таким образом, у вас никогда не будет блока потока на этапе выполнения задачи, ожидающего завершения другой задачи.