Зарегистрируйтесь, чтобы продолжить обучение

Асинхронность Java: Продвинутое использование

Example.java

class Example {
    public static void main(String[] args) {

        // Если нам нужно просто асинхронно выполнить задачу и не нужно ничего возвращать

        // В виде лямбды передаём объект Runnable
        CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
            // Задержка имитирует длительно выполняющуюся задачу
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            System.out.println("Run in separate thread");
        });

        // Ожидаем окончания работы задачи
        future1.get();


        // Асинхронный запуск задачи и возврат результата работы

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            // Задержка имитирует длительно выполняющуюся задачу
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Result of async computation";
        });

        // Ожидаем окончания работы задачи и получаем результат
        String result = future2.get(); // "Result of async computation"

        // Комбинирование двух CompletableFuture

        // Если одна задача не зависит от другой
        // Нужно выполнить две задачи независимо одна от другой и выполнить третью,
        // когда предыдущее будут завершены


        // Задачи выполняются независимо друг от друга
        System.out.println("Retrieving weight");
        CompletableFuture<Integer> futureWeight = CompletableFuture.supplyAsync(() -> {

            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
            return 100;
        });

        System.out.println("Retrieving volume");
        CompletableFuture<Integer> futureVolume = CompletableFuture.supplyAsync(() -> {

            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
            return 2;
        });

        // выполняется после завершения первых двух
        System.out.println("Calculate density");
        CompletableFuture<Integer> futureDensity = futureWeight.thenCombine(futureVolume, (weight, volume) -> {
            Integer density = weight / volume;
            return density;

        // Обработка исключений
        // Если при работе задач возникли исключения
        // их можно обработать в методе exceptionally
        }).exceptionally(ex -> {
            System.out.println("Oops! We have an exception - " + ex.getMessage());
            return null;
        });
    }
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 2 января

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»