Рабочие потоки ScheduledExecutorService сохраняют статус прерывания после FutureTask.cancel (true) - PullRequest
4 голосов
/ 10 ноября 2010

У меня есть задача, которую я планирую периодически запускать через ScheduledThreadPoolExecutor.scheduleAtFixedRate (task, rate, ...) .Пользователь может отменить эту задачу вручную, что вызывает ScheduledFuture.cancel (true) .По какой-то причине, возможно, в зависимости от того, когда они отменяют эту задачу, рабочий поток (который исполнитель использовал для выполнения моей задачи), по-видимому, остается в прерванном состоянии после завершения метода run () моей задачи.

Хотелось бы, чтобы рабочие потоки (взятые из пула и использованные повторно) очищали свой статус прерывания перед началом новой задачи с использованием существующих перехватчиков (через ThreadPoolExecutor.beforeExecute () или ThreadPoolExecutor.afterExecute () ).Но в реализации по умолчанию этого не происходит.

У меня есть два вопроса:

  • Как рабочий поток остается в состоянии, в котором установлен статус прерывания?
  • Почему реализация по умолчанию не очищает состояние прерывания перед началом новой задачи?

Ответы [ 2 ]

5 голосов
/ 11 ноября 2010
* How is it that the worker thread is left in a state where the interrupt status is set?
* Why does the default implementation not clear the interrupt status before starting a new task?

Ответы:

  • Не прервано.
  • Реализация, но вы не смотритеправильное место

Из кода библиотеки Oracle:

        /*
         * Ensure that unless pool is stopping, this thread
         * does not have its interrupt set. This requires a
         * double-check of state in case the interrupt was
         * cleared concurrently with a shutdownNow -- if so,
         * the interrupt is re-enabled.
         */
        if (runState < STOP &&
            Thread.interrupted() &&
            runState >= STOP)
            thread.interrupt();

Как видите, состояние прерывания очищается из рабочего потока, пока исполнитель не выключается.

0 голосов
/ 10 ноября 2010

Как пользователь прерывает поток?Если они используют компонент пользовательского интерфейса, ваша проблема может быть связана с проблемами синхронизации с потоком отправки событий.

...