ScheduledExecutor с подчиненным FixedPool Executor - PullRequest
0 голосов
/ 04 февраля 2019

[РЕДАКТИРОВАТЬ] Попытавшись немного поработать с кодом, мне нужен пул планируемых потоков, который запускается каждые 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, чтобы начать обработку?

Спасибо, Марк.

...