Monitor из пакета com.google.common.util.concurrent в библиотеке Guava. В этом посте я собираюсь продолжить рассмотрение утилит параллелизма Guava и обсудить интерфейс ListenableFuture . ListenableFuture расширяет интерфейс Future из пакета java.util.concurrent, добавляя метод, который принимает прослушиватель завершения. ListenableFuture
ListenableFuture ведет себя точно так же, как java.util.concurrent.Future но имеет метод addCallback(Runnable, ExecutorService) который выполняет обратный вызов в данном executor . Вот пример:
|
1
2
3
4
5
6
7
|
ListenableFuture futureTask = executorService.submit(callableTask)futureTask.addListener(new Runnable() { @Override public void run() { ..work after futureTask completed } }, executorService); |
Если отправленная задача была завершена при добавлении обратного вызова, она запустится немедленно. Использование метода addCallback имеет недостаток в том, что Runnable не имеет доступа к результату, полученному в future . Для доступа к результату Future вам потребуется использовать FutureCallback .
FutureCallback
FutureCallback принимает результаты, полученные из Future и указывает onSuccess и onFailure . Вот пример:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
class FutureCallbackImpl implements FutureCallback<String> { @Override public void onSuccess(String result){ .. work with result } @Override public void onFailure(Throwable t) { ... handle exception } } |
FutureCallback присоединяется с помощью метода addCallback в классе Futures:
|
1
|
Futures.addCallback(futureTask, futureCallbackImpl); |
В этот момент вы можете спросить, как получить экземпляр ListenableFuture , когда ExecutorService возвращает только Futures ? Ответ заключается в использовании ListenableExecutionService .
ListenableExecutionService
Чтобы использовать ListenableExecutionService просто украсьте экземпляр ExecutorService с помощью вызова MoreExecutors.listeningDecorator(ExecutorService) например:
|
1
|
ExecutorsService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); |
Вывод
С возможностью добавления обратного вызова, будь то Runnable или FutureCallback который обрабатывает условия успеха и неудачи, ListenableFuture может стать ценным дополнением к вашему арсеналу. Я создал юнит-тест, демонстрирующий использование ListenableFuture доступного как суть . В следующем посте я Futures классе Futures , который содержит статические методы для работы с futures .
Ресурсы
Ссылка: Google Guava Concurrency — ListenableFuture от нашего партнера по JCG Билла Бекака в блоге Randomечет о кодировании .