Заполнение записей в ConcurrentMap в java - PullRequest
0 голосов
/ 11 июля 2020

Я начинаю с концепции CompletableFuture в java. У меня есть случай использования, когда мне нужно заполнить значения в Map<String, CompletableFuture<Object>>.

Предполагая, что есть класс сущности Student и ConcurrentMap<String, CompletableFuture<Student>>. Я попытался ввести записи учеников на карту следующим образом:

Student student = new Student();
ConcurrentMap<String, CompletableFuture<Student>> studentMap = new ConcurrentMap<>();

CompletableFuture<Student> studentcf = new CompletableFuture<>();
studentcf.complete(student); // Not sure whether it is the right way to convert a entity into CompletableFuture

studentMap.put("Alex", studentcf);

Вышеупомянутое решение сработало, но я не уверен, правильный ли это способ сделать это (преобразование объекта в CompletableFuture). Может ли кто-нибудь предложить мне правильный способ выполнить описанный выше сценарий?

Любые предложения будут полезны !! Заранее спасибо !!

1 Ответ

2 голосов
/ 11 июля 2020

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

Пример:

    public Future<Student> calculateAsync() throws InterruptedException {
        CompletableFuture<Student> completableFuture 
          = new CompletableFuture<>();
     
        Executors.newCachedThreadPool().submit(() -> {
            Thread.sleep(5000);
            Student student = new Student();
            completableFuture.complete(student); //completed after 5 seconds
            return null;
        });
     
        return completableFuture; //return immediately
    }
    
    Future<Student> completableFuture = calculateAsync();
     
    // ... 
     
    Student result = completableFuture.get(); //This call is blocked until the result, which is generated by the embedded thread, is known.
...