Редактировать: кажется, что люди на самом деле не понимают фрагмент кода. Я сделаю это жирным шрифтом, чтобы никто не подошел ко мне снова, управлял внутренним ExecutorService
внешним образом, а не внутри Callable
лямбды, заботясь о том, чтобы надлежащим образом отключить его при необходимости .
То, что вы можете сделать, - это управлять одной запланированной задачей, и внутри нее выполнять пять рабочих.
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
scheduler.scheduleWithFixedDelay(
() -> {
final ExecutorService e = Executors.newFixedThreadPool(5);
final CompletionService<?> cs = new ExecutorCompletionService<>(e);
for (int i = 0; i < 5; i++) {
// Constant.workerThread[i] is a Runnable
cs.submit(Constant.workerThread[i], null);
}
for (int i = 0; i < 5; i++) {
try {
// Will block until a Future<?> result is available.
// Doesn't matter which one, it will take the first available.
cs.take();
} catch (final InterruptedException ignored) {
// Ingore the exception, as we care only
// about if all off them finished (abruptly or not)
}
}
// All of them finished!
e.shutdown();
}, 0, 20, TimeUnit.SECONDS));
JavaDoc для ExecutorCompletionService
A CompletionService
, который использует поставляемый Executor
для выполнения
задачи. Этот класс организует, что представленные задачи, по завершении,
помещается в очередь, доступную с помощью take
.
JavaDoc для ExecutorCompletionService#take
Извлекает и удаляет Future
, представляющий следующее завершенное
задача, ожидающая, если ее еще нет.
Это должно быть уточнено, но вы должны понять.