Я пытаюсь понять, как потоки работают в 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
) РЕДАКТИРОВАТЬ
Добавлен вызов interrupt ()
в перехвате для InterruptedException
.