>>332944941 (OP) В книге написано примерно так: shutdown() останавливает все потоки исполнения, находящиеся под управлением ExecutorService.
Это неверно. В Java ExecutorService.shutdown() не останавливает уже выполняющиеся задачи/потоки немедленно. Он запускает “мягкое” завершение: новые задачи больше не принимаются, но ранее отправленные задачи продолжают выполняться. Для ожидания завершения используют awaitTermination(). Более “жёсткий” вариант — shutdownNow(), но и он только пытается остановить выполняющиеся задачи через interrupt и не гарантирует мгновенную остановку.