Когда использовать, а не использовать Java-фьючерсы? - PullRequest
0 голосов
/ 17 февраля 2019

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

1 Ответ

0 голосов
/ 17 февраля 2019

Кроме того, зачем мне нужно определять пользовательский компонент-исполнитель задач, когда spring по умолчанию создает для вас простой компонент SimpleAsyncTaskExecutor

Вы не указали, что находитесь в стеке 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();
}
...