У меня есть два блока кода, которые, кажется, вызывают зависание основного потока сервера, но я действительно не уверен, почему он зависает ...
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