Когда вы используете ExecutorService
, вы не можете убивать потоки самостоятельно. ThreadPool решает, когда убить Thread
(обычно это может произойти, если Thread
был прерван).
В вашем случае вы должны поймать TimeoutException
и cancel
Future
. Если ваша «реальная» задача реагирует на прерывание (вызывая и обрабатывая InterruptedException
правильно), она будет работать. В противном случае вам следует проверить состояние Thread.currentThread().isInterrupted()
в цикле. Ваш пример кода будет выглядеть так:
public void threadTest() {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> submit = executor.submit(() -> {
try {
String threadName = Thread.currentThread().getName();
Thread.sleep(7000);
System.out.println("process completed after 7 seconds");
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); //preserve interruption status. based on this ThreadPool's interruption Policy will decide what to do with the Thread
}
});
try {
submit.get(2, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); //handle this
} catch (TimeoutException e) {
submit.cancel(true); //cancel the task
}
executor.shutdown();
}
Также помните, что если вы выполняете задачу в ThreadPool и выполняете операции, которые могут быть с InterruptedException
, в большинстве случаев вы должны сохранить статус прерывания.