Можете ли вы объяснить, что вы имеете в виду, когда говорите, что это немного "грязно"? Какие-то конкретные симптомы?
В любом случае, глядя на это с чистого листа, я бы сказал, что вы хотите уменьшить количество одновременных загрузок, которые вы выполняете за один раз, иначе вы, вероятно, достигнете какого-то ограничения с точки зрения количества соединений, которые вы выполняете. FTP-сервер разрешит один клиент, или количество подключений, которое разрешит операционная система клиента. Скорее всего, ваше приложение будет ограничено пропускной способностью, а не процессором, поэтому слишком большое количество потоков может привести к обратным результатам. По сути, вы будете загружать больше элементов одновременно, но с меньшей пропускной способностью.
Полагаю, у вашего приложения есть набор задач, которые отключаются cron4j, затем эти задачи берут каталог и загружают его через FTP, это звучит правильно?
Если это так, я бы предложил разделить это на пару этапов, сначала cron4j запускает задачи, которые создают работоспособный объект, который при выполнении будет выполнять загрузку по FTP вместо задачи, выполняющей саму загрузку. Поместите этот runnable в очередь (блокирующая очередь из java.util.concurrent была бы хорошей идеей). Затем у вас будет несколько экземпляров другой задачи, выполняющейся в пуле потоков, и эти задачи будут выводить задания из очереди и выполнять их (поэкспериментируйте с количеством потоков в пуле, чтобы увидеть, что дает вам хорошую пропускную способность). Это даст вам набор конкурирующих потребителей, которых вы можете ограничить эффективным количеством одновременных загрузок (например, 4 за раз).
Как отмечается в комментариях, паттерн SEDA звучит довольно интересно. Если вы собираетесь заниматься параллельным программированием на Java, я бы порекомендовал получить копию «Параллельного программирования на Java: принципы и шаблоны проектирования» Дуга Ли, он не включает в себя Java 5, но большая часть этого основана на том, что в книге все равно. Он четко объясняет множество вопросов о безопасности потоков и о том, как писать хороший Java-код.