Как вызвать асинхронный метод внутри Java thread?

В Java существует ли какой-либо способ вызова и обработки асинхронного метода внутри потока?

Рассмотрим сценарий, в котором один из методов внутри тела потока занимает больше времени для его выполнения. Из-за этого завершение потока занимает больше времени.

Я попробовал некоторые примеры, используя классы пакетов параллелизма, такие как FutureTask и Executors.

Возможно ли реализовать и обработать все исключения внутри асинхронного метода? и возможно ли получить успешные или ошибочные ответы, такие как Ajax success и error handlers в JavaScript?

Как обеспечить успешное выполнение асинхронного метода (с контекстом родительского потока или без него)?

1 ответ

  1. Наиболее естественным способом связи между асинхронным методом и родительским потоком является стандартный класс CompletableFuture:

    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;
    
    public class AsyncExample { 
        String input; // common data
    
        // async method
        public String toLower() {
            return input.toLowerCase();
        }
    
        // method on main thread
        public void run() {
            input = "INPUT"; // set common data
            try {
                // start  async method
                CompletableFuture<String> future = CompletableFuture.supplyAsync(this::toLower);
                // here we can work in parallel
                String result = future.get(); // get the async result
                System.out.println("input="+input+"; result="+result);
            } catch (InterruptedException | ExecutionException e) {
            }
        }
    
        public static void main(String[] args) {
            new AsyncExample().run();
        }
    }
    

    Обратите внимание, что создание и разогрев an Executor, включая используемый в Примере исполнитель по умолчанию, требует некоторого времени (50 МС на моем компьютере), поэтому вы можете создать и разогреть его заранее, например, предоставив пустой метод:

          CompletableFuture.supplyAsync(()->null).get();