#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); }