Вы всегда должны заканчивать потоки, проверяя флаг в цикле run()
(если есть).
Ваша нить должна выглядеть так:
public class IndexProcessor implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class);
private volatile boolean execute;
@Override
public void run() {
this.execute = true;
while (this.execute) {
try {
LOGGER.debug("Sleeping...");
Thread.sleep((long) 15000);
LOGGER.debug("Processing");
} catch (InterruptedException e) {
LOGGER.error("Exception", e);
this.execute = false;
}
}
}
public void stopExecuting() {
this.execute = false;
}
}
Тогда вы можете завершите поток, вызвав thread.stopExecuting()
. Таким образом, поток заканчивается чистым, но это занимает до 15 секунд (из-за вашего сна). Вы все равно можете вызвать thread.interrupt (), если это действительно актуально, но предпочтительный способ всегда должен проверять флаг.
Чтобы не ждать 15 секунд, вы можете разделить сон следующим образом:
...
try {
LOGGER.debug("Sleeping...");
for (int i = 0; (i < 150) && this.execute; i++) {
Thread.sleep((long) 100);
}
LOGGER.debug("Processing");
} catch (InterruptedException e) {
...