Когда использовать и не использовать java-фьючерсы?

Проходя асинхронное программирование в 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
380
1

Ответы 1

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();
}

Нет, я не ожидаю, что store_result обновит z. Здесь store_result — это просто метод, который сохраняет эти значения в базе данных или, возможно, отправляет эти значения в другой API, который будет их использовать.

user3248186 17.02.2019 15:03

@ user3248186 хорошо. Мой ответ остается в силе.

LppEdd 17.02.2019 15:06

Запускать асинхронную операцию и не заботиться о том, что она делает, всегда немного подозрительно. В частности, вас обычно должно интересовать, удалось ли это или не удалось, даже если вам не нужно возвращать «результат».

user10762593 17.02.2019 15:09

@другой-дэйв, конечно. Я просто отвечал на вопрос. Однако есть задачи определенного типа: «запустил и забыл».

LppEdd 17.02.2019 15:10

Я намеревался добавить комментарий к ОП, а не критиковать ваш ответ (за который я проголосовал).

user10762593 17.02.2019 15:11

Другие вопросы по теме