Вот фрагмент из книги 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 не вернется до тех пор, пока задача не завершится, что может произойти намного позже желаемого времени ожидания (или даже не вообще). Служба запуска по времени, которая не возвращается после указанного времени, вероятно, будет раздражать вызывающих ее пользователей.
Мои вопросы:
- Что означает время ожидания?
- Что такое отмена задачи?