Вопрос проверяет знание основных подходов к работе с асинхронным кодом в Java, что необходимо для создания отзывчивых и масштабируемых приложений.
Асинхронность в Java позволяет выполнять задачи, не блокируя основной поток выполнения, что критически важно для производительности серверных приложений, обработки множества одновременных запросов или операций ввода-вывода. Эволюция подходов отражает стремление упростить код и повысить его эффективность.
Пример с CompletableFuture для параллельного выполнения и комбинирования задач:
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
// Асинхронное получение данных
CompletableFuture futureData = CompletableFuture.supplyAsync(() -> fetchData());
// Асинхронная обработка
CompletableFuture processedFuture = futureData.thenApply(data -> process(data));
// Обработка ошибок и получение результата
processedFuture.exceptionally(ex -> "Fallback value")
.thenAccept(result -> System.out.println("Result: " + result));
}
static String fetchData() { /* Имитация долгого запроса */ return "raw data"; }
static String process(String s) { return s.toUpperCase(); }
}Пример использования ExecutorService для ограничения параллелизма:
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(4);
Future future = executor.submit(() -> computeExpensiveTask());
Integer result = future.get(); // Блокирующее получение результата
executor.shutdown();
}
static Integer computeExpensiveTask() { return 42; }
}Вывод: Выбор способа зависит от задачи. ExecutorService подходит для простого параллелизма задач. CompletableFuture — отличный выбор для построения асинхронных цепочек в современном Java. Реактивные библиотеки стоит применять для сложных потоков данных с необходимостью бэкпрессура. Ожидаемый Project Loom потенциально может упростить асинхронный код, сделав его похожим на синхронный.