Callable и DeferredResult являются двумя различными классами в Java, которые используются в асинхронном программировании. Они позволяют выполнять некоторые операции асинхронно и возвращать результат в будущем.
Callable является частью пакета java.util.concurrent и является функциональным интерфейсом. Он используется для выполнения операций в отдельном потоке и возможности вернуть результат. Метод Callable предоставляет метод call(), который должен быть переопределен в пользовательском классе. Он может возвращать значение любого типа, определенного в качестве дженерика, и может бросать проверяемые исключения.
Пример использования Callable может выглядеть следующим образом:
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); Callable<String> callableTask = () -> { // Выполнение долгой операции Thread.sleep(2000); return "Результат выполнения операции"; }; Future<String> future = executorService.submit(callableTask); try { String result = future.get(); System.out.println(result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executorService.shutdown(); } } }
DeferredResult, с другой стороны, является классом из фреймворка Spring и используется для возврата асинхронных результатов из контроллеров Spring MVC или Spring WebFlux. Он представляет собой типизированный контейнер, который возвращается из методов контроллеров и сохраняет результат, который будет использоваться в будущем.
Пример использования DeferredResult в Spring MVC может выглядеть так:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; @RestController @RequestMapping("/api") public class MyController { @GetMapping("/result") public DeferredResult<String> getResult() { DeferredResult<String> deferredResult = new DeferredResult<>(); new Thread(() -> { // Выполнение долгой операции try { Thread.sleep(2000); deferredResult.setResult("Результат выполнения операции"); } catch (InterruptedException e) { e.printStackTrace(); deferredResult.setErrorResult(e.getMessage()); } }).start(); return deferredResult; } }
Возвращаемый объект DeferredResult может быть использован для асинхронного получения результата работы некоторой операции. Результат будет установлен с помощью вызова метода setResult(), или в случае ошибки - с помощью метода setErrorResult(). Когда результат готов, контроллер Spring MVC автоматически отправляет его в ответ клиенту.
Таким образом, разница между Callable и DeferredResult заключается в следующем:
- Callable используется для выполнения операций в отдельном потоке и возвращения результата, тогда как DeferredResult используется для возврата асинхронных результатов из контроллеров Spring MVC или Spring WebFlux.
- Callable является частью пакета java.util.concurrent, тогда как DeferredResult является классом из фреймворка Spring.
- Callable может использоваться в любом контексте программирования на Java, тогда как DeferredResult предназначен специально для использования в Spring MVC или Spring WebFlux контроллерах.