Я пытаюсь понять, как работают потоки в 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()
в улове для InterruptedException
.