English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Guava - детальное объяснение параллельного программирования Futures

Guava предоставляет множество полезных расширений для Future в Java параллельного программирования,其主要接口为ListenableFuture,并借助Futures静态扩展。

ListenableFuture, наследующий от Future, позволяет нам добавлять функции回调 для выполнения после завершения вычислений или немедленного возврата при завершении выполнения метода.

Добавление функции回调 к ListenableFuture:

Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)

FutureCallback — это интерфейс, который содержит onSuccess(V), onFailure(Throwable).

Использование, например:

Futures.addCallback(ListenableFuture, new FutureCallback<Object>() {
  public void onSuccess(Object result) {
    System.out.printf("onSuccess with: %s%n", result);
  }
  public void onFailure(Throwable thrown) {
    System.out.printf("onFailure %s%n", thrown.getMessage());
  }
});

В Guava также расширены Futures для Future:

  1. transform: Преобразование возвращаемого значения ListenableFuture.
  2. allAsList: Объединение нескольких ListenableFuture, возвращает List с несколькими значениями Future, когда все Future успешны. Замечание: если один из Future失败了 или был отменен, то будет входить в процесс失败了 или отмены.
  3. successfulAsList: Как и allAsList, единственное отличие заключается в том, что для失败的 или отмененного Future возвращает null. Не входит в процесс失败了 или отмены.
  4. immediateFuture/immediateCancelledFuture: Immediately returns a ListenableFuture с ожидаемым значением.
  5. makeChecked: Преобразование ListenableFuture в CheckedFuture. CheckedFuture — это ListenableFuture, который содержит несколько версий метода get, который声明 выбрасывает проверяемые исключения. Это делает создание Future, который может выбрасывать исключения в логике выполнения, более легким.
  6. JdkFutureAdapters.listenInPoolThread(future): Guava предоставляет интерфейсную функцию для преобразования JDK Future в ListenableFuture.

ниже приведен пример теста для класса Future:

@Test
public void should_test_furture() throws Exception {
  ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
  ListenableFuture future1 = service.submit(new Callable<Integer>() {
    public Integer call() throws InterruptedException {
      Thread.sleep(1000);
      System.out.println("call future 1.");
      возврат 1;
    }
  });
  ListenableFuture future2 = service.submit(new Callable<Integer>() {
    public Integer call() throws InterruptedException {
      Thread.sleep(1000);
      System.out.println("call future 2.");
  //    throw new RuntimeException("----call future 2.");
      возврат 2;
    }
  });
  final ListenableFuture allFutures = Futures.allAsList(future1, future2);
  final ListenableFuture transform = Futures.transform(allFutures, new AsyncFunction<List<Integer>, Boolean>() {
    @Override
    public ListenableFuture apply(List<Integer> results) throws Exception {
      возврат Futures.immediateFuture(String.format("success future:%d", results.size()));
    }
  });
  Futures.addCallback(transform, new FutureCallback<Object>() {
    public void onSuccess(Object result) {
      System.out.println(result.getClass());
      System.out.printf("success with: %s%n", result);
    }
    public void onFailure(Throwable thrown) {
      System.out.printf("onFailure%s%n", thrown.getMessage());
    }
  });
  System.out.println(transform.get());
}

Официальная страница материалов:https://awk.so/@code.google.com!/p/guava-libraries/wiki/ListenableFutureExplained

Вот так и была собрана информация о Guava - параллельное программирование Futures, продолжим дополнять соответствующую информацию, спасибо всем за поддержку нашего сайта!

Декларация: содержимое этой статьи взято из Интернета, авторские права принадлежат их законным владельцам, материалы предоставлены пользователями Интернета в порядке добровольного участия и загрузки, сайт не обладает правами собственности, не был подвергнут редактированию и не несет ответственности за юридические последствия. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При подтверждении факта нарушения, сайт незамедлительно удалят涉嫌侵权的内容.

Вам может понравиться