Почему мы не должны планировать прерывание заимствованного потока?

Вот фрагмент из книги Java Concurrency in Practice:

//Scheduling an interrupt on a borrowed thread. Don’t do this.

private static final ScheduledExecutorService cancelExec = ...;

public static void timedRun(Runnable r,long timeout, TimeUnit unit) {
    final Thread taskThread = Thread.currentThread();
    cancelExec.schedule(new Runnable() {
        public void run() { taskThread.interrupt(); }
    }, timeout, unit);
    r.run();
}

Автор говорит:

Это привлекательный простой подход, но он нарушает правила: вы должны знать политику прерывания потока, прежде чем прерывать его. Поскольку timedRun может быть вызван из произвольного потока, он не может знать политику прерывания вызывающего потока. Если задача завершается до истечения времени ожидания, задача отмены, которая прерывает поток, в котором был вызван timedRun, может завершиться после того, как timedRun вернется к вызывающей стороне. Мы не знаем, какой код будет работать, когда это произойдет, но результат не будет хорошим. (Возможно, но на удивление сложно устранить этот риск, используя ScheduledFuture, возвращаемый по расписанию, для отмены задачи отмены.)

Кроме того, если задача не реагирует на прерывание, timedRun не вернется до тех пор, пока задача не завершится, что может произойти намного позже желаемого времени ожидания (или даже не вообще). Служба запуска по времени, которая не возвращается после указанного времени, вероятно, будет раздражать вызывающих ее пользователей.

Мои вопросы:

  1. Что означает время ожидания?
  2. Что такое отмена задачи?

person user2916610    schedule 22.10.2015    source источник


Ответы (1)


Тайм-аут означает, что taskThread есть выделенный интервал времени для запуска задачи, прежде чем она будет прервана. Задача отмены — это выделенная задача, которая выполняет прерывание (в отдельном потоке).

Опасности здесь следующие:

  • Код прерывает поток, а не отменяет задачу. Прерванный поток может быть частью пула потоков и может уже завершить задачу и быть в середине какой-то совершенно другой задачи.

  • Прерванная задача может не использовать прерывание надлежащим образом в качестве индикатора завершения своей работы или может выполнять что-то вроде блокировки ввода-вывода, когда она не может проверить состояние прерывания, поэтому в целом нет гарантии, что тайм-аут истек. эффективный.

person Nathan Hughes    schedule 22.10.2015
comment
Я думаю, что тайм-аут означает, что поток имеет выделенный интервал времени для запуска потока. Тайм-аут означает, что задача имеет выделенный интервал времени для выполнения потока. обкатать. А что отведено? - person Jason Law; 02.01.2020