Как запланировать группу потоков (задач) в разное время? - PullRequest
0 голосов
/ 21 октября 2011

Мне нужно запустить 10 задач асинхронно в разное время в течение дня до определенного часа следующего дня.Чем ближе я подхожу ко времени на следующий день, тем больше мне приходится повторять эти 10 заданий.

Мой вопрос, как мне справиться с этим?Каких исполнителей мне следует использовать?Каков наилучший способ управления памятью?

Я подумал об использовании Executors.newScheduledThreadPool, который мог бы запустить процесс пула потоков с 10 задачами в переменное время.Проблема требует от меня запуска нового набора задач, даже если предыдущая группа задач еще не завершена (поэтому, вероятно, каждый раз запускается новый пул потоков).

Я также думаю об использовании своего рода реестра процессов для управления различными запущенными процессами.Когда процесс не используется больше, чем реестр может остановить его.

И каждый раз, когда задачи выполняются, я думал о сбрасывании runnables и остановке пула потоков.Это в целом хорошее решение?

Проблема, которая может возникнуть, состоит в том, чтобы заполнить память пулами потоков.Может быть, установить ограничение по времени в пуле потоков?

1 Ответ

1 голос
/ 21 октября 2011

Полагаю, вам нужен один поток диспетчеризации в простом пуле без планирования и другой пул для рабочих, что-то вроде этого:

    ExecutorService ex = Executors.newFixedThreadPool(1);
    final ExecutorService workersPool = Executors.newCachedThreadPool();

    ex.submit(new Runnable() {
        public void run() {
            try {
                do { 
                    // determine if it's time to start workers
                    if (timeToStartWorkers()) {
                        workersPool.submit(new Worker(...));
                        workersPool.submit(new Worker(...));
                        ...
                    }
                    // sleep till next time
                    Thread.sleep(timeTillNextCheck);
                }
            } catch (InterruptedException e) {
                // handle exception
            }
        }
    });

Нет необходимости заново создавать пулы потоков.

...