Мне пришлось реализовать эту самую функциональность пару лет go.
Прерывание потока не убивает его и не останавливает . Он просто активирует флаг, чтобы поток знал, что попросили остановиться. Большинство внутренних методов проверяют это и выдают InterruptedException
, чтобы вы могли его поймать, но некоторые потоки с радостью игнорируют любые запросы на прерывание.
Итак, сама задача - определить этот сценарий и действовать соответствующим образом.
По сути, ваш метод interrupt()
должен установить какой-либо флаг на true
, и ваша работа должна время от времени проверять этот флаг и останавливать все, что делает, когда замечает, что флаг активен.
Вот как Я реализовал это:
public clas SomeJob implements InterruptableJob {
protected AtomicBoolean stopFlag = new AtomicBoolean(false);
@Override
public void execute(final JobExecutionContext context) {
for (Item item : listOfItems) { // whatever long tasks(s) you are doing,
if (stopFlag.get()) { // just check for this on every main loop
logger.error("Job interrupted! Leaving at item: "+item);
break;
}
performTask(item);
}
cleanUp();
return;
}
private void performTask(Item item) {
for(....) { // another loop,
if (stopFlag.get()) { // another check
// ....
return; // or break, depending on each case
}
someInternalProcessing(...);
}
}
@Override
protected void interrupt() {
stopFlag.set(true);
}
}
Вот и все. Просто убедитесь, что вычистили, закройте соединения и т.д. перед прерыванием.