CompletableFuture join() вызывает зависание основного потока

#java #asynchronous #freeze #completable-future

#java #асинхронный #замораживание #завершаемый-будущее

Вопрос:

У меня есть два блока кода, которые, похоже, вызывают зависание основного серверного потока, но я действительно не уверен, почему он зависает…

 public static synchronized CompletableFuture<Void> saveAllToDatabase() {
    return CompletableFuture.runAsync(() -> {
        for (UUID u : timeMap.keySet()) {
            saveUUIDToDatabase(u).join(); //This is PlaytimeManager:217
        }
    });
}

public static synchronized CompletableFuture<Void> saveUUIDToDatabase(UUID uuid) {
    return CompletableFuture.runAsync(() -> {
        if (timeMap.get(uuid) == null) return;
        long l = getTime(uuid);
        long p = getPoints(uuid).join(); //This is PlaytimeManager:199
        Playtime.getData().save(uuid, l, p);
    });
}

public static CompletableFuture<Long> getPoints(UUID u) {
    Database d = Playtime.getData();
    return CompletableFuture.supplyAsync(() -> {
        if (d.isSaved(u)) return getCachedPoints(u) == 0 ? d.getPlayer(u).getPoints() : getCachedPoints(u);
        return getCachedPoints(u);
    });
}
  

#join() Методы вызывают зависание, но они выполнены асинхронно CompletableFuture , поэтому я не уверен, как именно это происходит…

Трассировка стека:https://pastebin.com/5QhJPPhn

Комментарии:

1. Какой тип возвращается для getPoints(uuid) метода?

2. Он возвращает CompletableFuture<Long> . Код обновлен в исходном сообщении с помощью getPoints метода

3. пробовал с минимальным количеством кода и удалил зависимые модули, у меня все работает нормально public static synchronized CompletableFuture<Void> saveAllToDatabase() { return CompletableFuture.runAsync(() -> { for (UUID u : timeMap.keySet()) { saveUUIDToDatabase(u).join(); //This is PlaytimeManager:217 } }); }

4. public static synchronized CompletableFuture<Void> saveUUIDToDatabase(UUID uuid) { return CompletableFuture.runAsync(() -> { long p = getPoints(uuid).join(); //This is PlaytimeManager:199 System.out.println(uuid.toString() ":" p); }); }

5. public static CompletableFuture<Long> getPoints(UUID u) { return CompletableFuture.supplyAsync(() -> 10L); }