Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Проводник по способам класса java.util.concurrent.CompletableFuture

Anna | 2.06.2014 | нет комментариев
Класс CompletableFuture — средство для передачи информации между параллельными потоками исполнения. По существу это блокирующая очередь, способная передать только одно ссылочное значение. В различие от обыкновенной очереди, передает также исключение, если оно появилось при вычислении передаваемого значения.

Класс содержит несколько десятков способов, в которых легко потеряться. Данная статья систематизирует эти способы по нескольким знакам, Дабы в них было легко ориентироваться.

Для разминки познакомимся с новыми интерфейсами из пакета java.util.Function, котрые применяются как типы параметров во многих способах.

// два параметра, возвращает итог
BiFunction<T, U,R> {
  R apply(T t, U u);
}
// два параметра, не возвращает итог
BiConsumer<T,U>  {
  void  accept(T t, U u)
}
// один параметр, возвращает итог
Function<T, R> {
  R apply(T t);
}
// один параметр, не возвращает итог
Consumer<T> {
  void accept(T t);
}
// Без параметров, возвращает итог
Supplier<T> {
  T get();
}

Припомним также ветхий добродушный Runnable:

// Без параметров, не возвращает итог
Runnable {
  void run();
}

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

Как средство передачи данных, класс CompletableFuture имеет два суб-интерфейса — для записи и для чтения, которые в свою очередь деляться на непосредственные (синхронные) и опосредованные (асинхронные). Программно выделен только суб-интерфейс непосредственного чтения (java.util.concurrent.Future, присутствующий со времен java 5), но в целях систематизации благотворно мысленно выделять и остальные. Помимо этого распределения по суб-интерфейсам, я также буду усердствовать отделять базовые способы и способы, реализующие частные случаи.

Для краткости взамен “объект типа CompletableFuture” будем говорить “фьючерс”. «Данный фьючерс» обозначает фьючерс, к которму применятся описываемый способ.

1. Интерфейс непосредственной записи

Базовых способов, ясно, два — записать значение и записать исключение:

boolean complete(T value)
boolean completeExceptionally(Throwable ex)

с явственной семантикой.

Прочие способы:

boolean cancel(boolean mayInterruptIfRunning)

равнозначен completeExceptionally(new CancellationException). Введен для совместимости с java.util.concurrent.Future.

static <U> CompletableFuture<U> completedFuture(U value)

равнозначен CompletableFuture res=new CompletableFuture(); res.complete(value).

void obtrudeValue(T value)
void obtrudeException(Throwable ex)

Насильственно перезаписывают хранящееся значение. Правильный метод выстрелить себе в ногу.

2. Интерфейс непосредственного чтения

boolean isDone()

Проверяет, был ли теснее записан итог в данный фьючерс.

T get()

Ожидает, если итог еще не записан, и возвращает значение. Если было записано исключение, бросает ExecutionException.

Прочие способы:

boolean isCancelled()

проверяет, было ли записано исключение с поддержкой способа cancel().

T join()

То же, что get(), но бросает CompletionException.

T get(long timeout, TimeUnit unit)

get() с тайм-аутом.

T getNow(T valueIfAbsent)

возвращает итог незамедлительно. Если итог еще не записан, возвращает значение параметра valueIfAbsent.

int getNumberOfDependents()

при!br/> Дальнейший пример взят из http://nurkiewicz.blogspot.ru/2013/05/java-8-definitive-guide-to.html:

CompletableFuture<Integer> safe = future.handle((r, ex) -> {
    if (r != null) {
            return Integer.parseInt(r);
    } else {
            log.warn("Problem", ex);
            return -1;
    }
});

Тут future вырабатывает итог типа String либо ошибку, реакция переводит итог в целое число, а в случае ошибки выдает -1. Подметим, что вообще-то проверку нужно начинать с if (ex!=null), так какr==nullможет быть как при аварийном, так и типичном заключении, но в данном примере случай r==nullрассматривается как оплошность.

Если будет интерес, проявленный в виде предложений решить те либо иные задачи, то будет и продолжение.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB