Параллелизм - прерывание будущего без его отмены - PullRequest
12 голосов
/ 18 января 2012

Есть ли способ прервать будущее без его отмены?

API Java-документа:

логическое отмена (логическое значение mayInterruptIfRunning)

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

Чтобы перехватить прерывание, мы должны правильно перехватить ПрерванноеИсключение или проверка метода isInterrupted () в методе Runnable / Callable.

Но нет способа прервать работающее Future с использованием интерфейса Future

, поскольку все потоки находятся в службе исполнителяпул, никто не может сделать thread.interrupt ().Вот почему предполагалось, что любое прерывание будет происходить только в случае отмены Future или завершения пула потоков?

Я пытаюсь понять, почему в интерфейсе Future нет метода прерывания.Любая помощь будет принята с благодарностью

Ответы [ 3 ]

8 голосов
/ 22 января 2012

Причина заключается в разнице в абстракции, которая является Future и конкретным исполнением в потоке.Мы не можем сказать, связано ли будущее с одним потоком или несколькими потоками.Будущее может запустить новые потоки, запустить новые фьючерсы и т. Д.

Рассматривать эти абстракции как взаимодействия между клиентским кодом и исполнителем фьючерсов.Концептуально имеет смысл сказать «отменить эту задачу, которую я просил вас выполнить», потому что ваша задача была отменить.Возможно, я занят работой над этим, или я еще не запустил его, или он может быть закончен, но это нормально, я отменю это, если вы захотите.Вот почему у нас есть метод отмены.

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

0 голосов
/ 30 января 2016

Есть полезные варианты для этого.

Поскольку проблема с Future API заключается в том, что он не предоставляет возможность для определения того, что выполнение остановлено. isCancelled () и isDone () будут оба счастливо возвращать true, даже если выполнение Callable продолжается.

Так что на самом деле речь идет не об уровне абстракции Будущее API на данном этапе.Но это невозможность определить завершение задачи.Иными словами, невозможно провести различие между отменой запроса и завершенной отменой действия .

Один из способов - использовать CountdownLatch как сделано в вопросе Ожидание отмененного будущего, чтобы фактически закончить .Это будет сигнализировать ожидающему абоненту о том, что задача действительно выполнена, а не только о том, что она остановлена.

0 голосов
/ 02 февраля 2012

В любом случае вы можете использовать тайм-аут, поэтому вы прервете свое ожидание.

get(long timeout, TimeUnit unit) 
...