Я пытаюсь понять, как работают потоки в Java, и в настоящее время изучаю, как реализовать зацикленные потоки, которые можно отменить. Вот код:
public static void main(String[] args) throws Exception {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("THREAD: started");
try {
while(!isInterrupted()) {
System.out.printf("THREAD: working...\n");
Thread.sleep(100);
}
} catch(InterruptedException e) {
// we're interrupted on Thread.sleep(), ok
// EDIT
interrupt();
} finally {
// we've either finished normally
// or got an InterruptedException on call to Thread.sleep()
// or finished because of isInterrupted() flag
// clean-up and we're done
System.out.println("THREAD: done");
}
}
};
t.start();
Thread.sleep(500);
System.out.println("CALLER: asking to stop");
t.interrupt();
t.join();
System.out.println("CALLER: thread finished");
}
Поток, который я создаю, предназначен для того, чтобы его рано или поздно прервали. Итак, я проверяю флаг isInterrupted(), чтобы решить, нужно ли мне продолжать, а также перехватываю InterruptedException
для обработки случаев, когда я нахожусь в операции ожидания (sleep
, join
, wait
).
Вещи, которые я хотел бы уточнить:
- Можно ли использовать механизм прерывания для такого рода задач? (по сравнению с
volatile boolean shouldStop
) - Правильно ли это решение?
- Это нормально, что я проглатываю InterruptedException? Меня не очень интересует, что это был за фрагмент кода, где кто-то просил прервать мой поток.
- Есть ли более короткие пути решения этой проблемы? (главное - "бесконечный" цикл)
EDIT Добавлен вызов interrupt()
в catch для InterruptedException
.