Это работает, однако вы никогда не закрываете созданный вами пул. Вы можете прочитать об этом в ExecutorService документации. Добавьте это в конце, чтобы закрыть свой бассейн:
s.shutdown();
try {
if(!s.awaitTermination(3, TimeUnit.SECONDS)) {
s.shutdownNow();
}
} catch (InterruptedException e) {
s.shutdownNow();
}
Дальнейшее объяснение :
Future::get
является операцией блокировки. При некоторых обстоятельствах ваш цикл может никогда не быть вызван, потому что задача, поддерживаемая будущим, может быть завершена до того, как условие цикла будет оценено. Но в большинстве случаев в первой итерации цикла вы будете вызывать Future::get
, который блокирует операцию. Затем вы получаете результат и снова условие цикла оценивается как ложное, потому что будущее сделано. В заключение - ваш цикл будет вызываться 0 или 1 раз. И после этого вы должны закрыть пул, как я писал ранее.