2016-01-06 2 views
1

Я хочу добиться того, что следующий псевдокод иллюстрирует:Установить будущее от обратного вызова

int functionA() { 
    Future res; 
    // ... 
    setCallbackForSomething(new Callback() { 
     public void onCall() { 
      // ... 
      res = 5; 
     } 
    }); 
    // ... 
    return doSomethingElse(res.get()); 
} 

т.е. блоков functionA до обратного вызова не было названо, затем обрабатывает результат и возвращает что-то.

Возможно ли это с Future? Обычное использование,

Future res = executor.submit(...); 
... 
res.get() 

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

ответ

3

Future имеет ограниченные возможности. Из javadoc

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

Он только предоставляет операции чтения (кроме cancel). Future вы не сможете достичь того, чего хотите.

Вместо этого, так как Java 8, вы можете использовать CompletableFuture

Future, которые могут быть явно завершена (устанавливая ее значение и статус), и может быть использовано в качестве CompletionStage, поддерживая зависимые функции и действия который запускается после его завершения.

Вы инициализировать CompletableFuture

CompletableFuture<Integer> res = new CompletableFuture<>(); 

и завершить его либо normally или exceptionally

setCallbackForSomething(new Callback() { 
    public void onCall() { 
     // ... 
     res.complete(5); // or handle exception 
    } 
}); 

Вместо вызова get, вы можете chain a completion task на CompletableFuture позвонить doSomethingElse.

res.thenAccept(value -> doSomethingElse(value)); 

Хотя вы все еще можете назвать get, если вы хотите, блокирование, пока будущее не будет завершено.


Перед Java 8, библиотека гуавы при условии SettableFuture для достижения «установить» часть обещанной стоимости. Но это также ListenableFuture, поэтому вы можете связать другие операции с завершением.

Смежные вопросы