Pascal4eg / Java

 Java | Фишки и трюки

Использование интерфейса Callable вместе с классом Future для выполнения асинхронных задач и получения их результата

ExecutorService executor = null;
try {
    executor = Executors.newFixedThreadPool(1);
    Future<Integer> futureResult = executor.submit(() -> {
        // Выполнение сложной вычислительной задачи
        int result = 0;
        for (int i = 0; i < 100; i++) {
            result += i;
            Thread.sleep(100);
        }
        return result;
    });

    // Другие действия, выполняемые параллельно
    // Ожидание завершения асинхронной задачи и получение результата
    Integer result = futureResult.get();
    System.out.println("Результат: " + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} finally {
    if (executor != null) executor.shutdown();
}
В данном примере создается пул потоков размером 1, затем создается асинхронная задача с использованием интерфейса Callable, который возвращает результат типа Integer. Задача выполняет "сложное вычисление".

После создания задачи, она отправляется на выполнение в пул потоков. Далее, можно выполнять другие действия параллельно с ожиданием завершения задачи.

Метод get() вызывается для ожидания завершения задачи и получения результата. Если задача еще не завершилась, вызов этого метода блокируется. Возможны исключения, такие как InterruptedException или ExecutionException, которые необходимо обработать.

Затем поток пул завершается вызовом shutdown().