Краткий ответ: Вы не можете остановить работающий поток, который не взаимодействует. Существует устаревший метод destroy()
для потоков, но это приведет к «плохому» состоянию вашей виртуальной машины.
Единственная возможность завершить очистку потока - это прервать его. Но проверить прерывание - задача самого потока.
Так что ваша methodImExcecuting
должна выглядеть так:
void methodImExecuting() throws InterruptedException {
// it depends on your implementation, I assume here that you iterate
// over a collection for example
int loopCount = 0;
for (Foo foo : foos) {
++loopCount;
if (loopCount % 100 == 0) {
if (Thread.interrupted())
throw new InterruptedException();
}
...
}
От вашей реализации зависит, как часто вам придется смотреть, прерывается ли ваш поток. Но это факт, что вызов executorService.shutdownNow();
установит флаг interrupted
только для всех потоков, запущенных в данный момент в executorService. Чтобы действительно прервать поток, поток должен сам проверить, установлен ли флаг interrupted
, а затем выбросить InterruptedException
.