[РЕДАКТИРОВАТЬ] Попытавшись немного поработать с кодом, мне нужен пул планируемых потоков, который запускается каждые 5 секунд и пытается выполнить некоторую работу.Только пять потоков должны использоваться одновременно.
private final ScheduledExecutorService timerService = Executors.newScheduledThreadPool(5);
Тогда у меня есть метод start, который запускает выполнение
@Override
public void start() {
timerService.scheduleAtFixedRate(this::reportTimeElapse, 0, 5, TimeUnit.SECOND);
}
Метод start вызывается только один раз икаждые 5 секунд он вызывает метод reportTimeElapse, который запускает метод timeElapsed слушателей.
private void reportTimeElapse() {
try {
listeners.forEach(Listener::timeElapsed);
}catch(Throwable t) {
t.printStackTrace();
logger.error(t.toString(), t);
}
}
В методе timeElapsed я создаю новый пул фиксированных потоков размером 5.
ExecutorService executor = Executors.newFixedThreadPool(5);
ИЯ думаю, что именно здесь возникает моя проблема.вполне возможно, что в ScheduledExecutorService имеется только 5 потоков, но метод timeElapsed слушателя вызывается неоднократно, и именно поэтому каждый раз создается новый фиксированный пул потоков из пяти.
По сути, я ищу какой-то способ иметь только 1 newFixedThreadPool (5) на каждый запланированный поток и чтобы ScheduledExecutorService просто блокировал очередь обработки, пока поток работает.
У меня есть одна служба ScheduledExecutorService, которая запускается каждые пять секунд.Пул имеет размер 5. Он просматривает файлы в определенной папке, используя FileFilter, чтобы увидеть, есть ли какие-либо новые файлы, затем он объединяет их не более 5 раз, архивирует их и отправляет через REST в другую службу, которая обрабатываетфайлы.
В каждом запланированном потоке есть фиксированный ThreadPool из 5 потоков.Каждый ScheduledThread принимает на себя ответственность за 50 файлов одновременно, поэтому каждый поток в пуле потоков должен обрабатывать около 10 файлов каждый.Я пытаюсь выяснить способ, которым потоки не блокируют друг друга?Поэтому, если я получаю список из 50 файлов из потока планирования, инициализирую 5 исполняемых файлов по 5 файлов в каждом и запускаю их, как я могу это сделать, чтобы, когда 3-й поток возвращается скажет, он сразу же запускался со следующими 5 файлами всписок вместо блокировки, потому что я использовал invokeAll, чтобы начать обработку?
Спасибо, Марк.