Основные ошибки здесь:
- Вы проверяете только прекращение каждые 60 с. Таким образом, если вы просто пропустите переход с несостоявшегося на прекращенный, вы можете ждать до 60 секунд слишком долго
- Вы не прерываете текущий поток, когда вас прерывают. Если вас прерывают, вы (почти) всегда хотите сохранить тот факт, что вас прервали, чтобы код, вызвавший этот код, мог знать, что ему нужно остановить то, что он делает. В идеале это делается для того, чтобы позволить
InterruptedException
распространяться, но в качестве альтернативы путем повторного прерывания потока.
Было бы лучше использовать
es.awaitTermination(60, SECONDS);
для остановки, как только исполнитель завершит работу.
И, когда вы ловите прерывание:
Thread.currentThread().interrupt();
, чтобы позволить ему распространяться.
Или отказаться от петли и просто поспать действительно долго:
es.awaitTermination(Long.MAX_VALUE, SECONDS);