Я разрабатываю плагин Minecraft с использованием Bukkit API.
Я хочу проверить, зарегистрирован ли игрок с помощью специального статического метода.
static boolean isRegistered(String username)
Этот метод должен выполнять запрос MySQL (SELECT) и соответственно возвращать истину / ложь. Чтобы избежать задержки основного потока, я хотел бы выполнить этот запрос в потоке Async внутри этого метода. Bukkit реализует Runnable под названием BukkitRunnable
, который используется следующим образом:
static boolean isRegistered(String username) {
new BukkitRunnable() {
/* MySQL code here */
}.runTaskAsynchronously(this);
}
поэтому извне этого метода мы не знаем, что этот метод делает внутри. Мы просто хотим получить истину, если игрок зарегистрирован, и нам все равно, как это делает этот метод.
Теперь предположим, что этот метод является частью API, который предоставляет некоторые методы, такие как isRegistered
, поэтому мы не знаем, откуда он будет вызван.
Мой вопрос: как я могу правильно вернуть true / false из моего isRegistered
метода, не заставляя основной поток ждать до завершения запроса?
return
aboolean
и запускать задачу асинхронно - это ерунда - вы не можете съесть свой торт и получить его тоже. Вам либо необходимо иметь тип возвратаFuture<Boolean>
и запускать async , либо иметь тип возвратаboolean
и запускать синхронизацию. Если исполняемый код ожидаетboolean
, он будет ждать, пока не получит его (или _6 _) ... - person Boris the Spider   schedule 26.08.2016