Прерывание зацикленных потоков в Java

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

Я хотел бы уточнить следующее:

  1. Можно ли использовать механизм прерывания для такого рода задач? (по сравнению с volatile boolean shouldStop )
  2. Верно ли это решение?
  3. Это нормально, что я проглатываю InterruptedException? Мне не очень интересно, в каком фрагменте кода кто-то попросил мой поток прервать.
  4. Есть ли более короткие способы решения этой проблемы? (главное - наличие «бесконечного» цикла)

РЕДАКТИРОВАТЬ Добавлен вызов interrupt () в перехвате для InterruptedException .

5
задан Andrey Agibalov 11 August 2011 в 12:18
поделиться