Акка-способ передачи данных между потоками, который, по сути, является тем, что вы делаете путем блокировки выше, - это составление фьючерсов или отправка сообщения Актеру.
Следующий пример взят из документации Akka.
final ExecutionContext ec = system.dispatcher();
Future<String> f1 = future(new Callable<String>() {
public String call() {
return "Hello" + "World";
}
}, ec);
Future<Integer> f2 = f1.map(new Mapper<String, Integer>() {
public Integer apply(String s) {
return s.length();
}
}, ec);
f2.onSuccess(new PrintResult<Integer>(), system.dispatcher());
Обратите внимание, что в этом примере данные «возвращаются», или, точнее, они передаются другой единице работы без необходимости блокировать поток и ждать результата.
Вот почему onSuccess возвращает void, он должен использоваться в конце цепочки составленных фьючерсов. Если бы он должен был вернуть значение, это было бы как map, и он вернул бы другое Future. Что оставило бы вас с тем же требованием блокировки.
Таким образом, чтобы ответить на ваш вопрос, нет. Невозможно «вернуть» значение из асинхронного будущего без блокировки. Вместо этого вы должны понять, почему вам нужно, чтобы Response возвращался таким образом, и посмотреть, можете ли вы вместо этого переместить обработку Response в onSuccess или map. Незначительная альтернатива - вернуть Future [Response] и позволить вызывающей стороне беспокоиться о связывании фьючерсов. Случай, с которым вы столкнулись, обычно случается при смешивании парадигм, и его лучше избегать.
person
Chris K
schedule
20.08.2014