Вход для ExecutorService
- либо Runnable
, либо Callable
. Любая задача, которую вы отправляете, должна реализовывать один из этих двух интерфейсов. Если вы хотите отправить группу задач в пул потоков и подождать, пока они не будут завершены, вы можете использовать метод invokeAll и выполнить цикл по полученным Future
s, вызывая get
для каждого : см. этот информативный ответ на аналогичный вопрос.
Вам не нужно группировать входные задачи в группы. Вы никогда не хотите, чтобы у службы executor были незанятые потоки, пока еще есть над чем работать! Вы хотите, чтобы он мог захватить следующую задачу, как только освободятся ресурсы, и группирование таким способом противоречит этому. Ваш код делает это:
while non-empty input lists exist {
for each non-empty input list L {
t = new Runnable(L.pop())
executor.submit(t)
}
while (executor.hasTasks()) {
wait
}
}
Как только одна из этих задач завершится, этот поток сможет свободно переходить к другой работе. Но это не так, потому что вы ждете, пока все N задач завершатся, прежде чем отправлять больше. Отправьте их все сразу с помощью invokeAll
и позвольте службе исполнителя выполнить то, для чего она была создана.