CompletableFuture join () вызывает зависание основного потока - PullRequest
1 голос
/ 07 марта 2019

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

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

...