Проходя асинхронное программирование в java, я наткнулся на Futures. Насколько я понял, мы используем фьючерсы, возвращая объект типа будущего, если мы хотим использовать результат этих асинхронных методов в нашем методе. Поскольку в моем потоке блокируется какое-то другое требование, этот асинхронный процесс подхватывается и заменяет местозаполнитель будущих объектов, чтобы его затем можно было использовать методом вызывающего объекта. Правильно ли я предполагаю это?
Но что, если в моем случае API, который я создаю, не нуждается в результате асинхронного метода? Например, скажем, мое требование выглядит так.
int addInts(int x, int y) {
int z = x+y;
store_result(x, y, z);
return z;
}
@Async
void store_result(int x, int y, int z) {
//persist these results in some db or call some other api here
}
Таким образом, addInts просто суммирует целые числа и возвращает результат, и, поскольку я не хочу ждать, пока результат будет сохранен, я поместил его в асинхронный метод, от которого я в любом случае не очень завишу.
Так что в этом случае мне не нужно использовать фьючерсы, верно?
Обновлено: Также зачем мне определять пользовательский компонент-исполнитель задач, когда Spring по умолчанию создает для вас простой компонент SimpleAsyncTaskExecutor?




Also Why would I need to define a custom task executor bean when spring by default creates a simple SimpleAsyncTaskExecutor bean for you
Вы не указали, что находитесь в стеке Spring. Если вас это устраивает, достаточно аннотировать ваш метод с помощью @Async, чтобы он запускался через предварительно настроенный ExecutorService или ThreadPoolTaskExecutor.
С этим фрагментом кода
store_result(x, y, z);
return z;
вы ожидаете, что store_result обновит значение z? Потому что этого не произойдет, так как z имеет примитивный тип, и они передаются по значению, а значит их значение копируется. Но да, я думаю, это был просто пример.
И нет, в этом случае вам не нужен Future<T>. Однако вы можете захотеть завладеть им, если вам потенциально нужно cancel задание или когда вас интересует статус (done, canceled).
Примером использования Future<T> может быть
int addInts(int x, int y) {
final int z = x + y;
final Future<Integer> result = executorService.submit(new StoreResultCallable(z));
// Continue the method execution
// Now we are at the end of the method. We ask our Future<Integer>
// if the result of the computation is ready. If it is ready, it will immediatly return,
// otherwise the execution will be blocked (with a possible predefined timeout value)
return result.get();
}
@ user3248186 хорошо. Мой ответ остается в силе.
Запускать асинхронную операцию и не заботиться о том, что она делает, всегда немного подозрительно. В частности, вас обычно должно интересовать, удалось ли это или не удалось, даже если вам не нужно возвращать «результат».
@другой-дэйв, конечно. Я просто отвечал на вопрос. Однако есть задачи определенного типа: «запустил и забыл».
Я намеревался добавить комментарий к ОП, а не критиковать ваш ответ (за который я проголосовал).
Нет, я не ожидаю, что store_result обновит z. Здесь store_result — это просто метод, который сохраняет эти значения в базе данных или, возможно, отправляет эти значения в другой API, который будет их использовать.