Ожидайте будущего Java 5 в сопрограммах Kotlin, не блокируя потокJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Ожидайте будущего Java 5 в сопрограммах Kotlin, не блокируя поток

Сообщение Anonymous »

У меня есть функция приостановки, из которой я хочу вернуть результат будущего Java 5. Объект будущего происходит из другой библиотеки Firebase Cloud Firestore — Admin SDK для Java и предоставляет блокирующий вызов get() для получения результата указанного будущего.
Моя функция выглядит вот так-

Код: Выделить всё

suspend fun getPrefix(messageCreateEvent: MessageCreateEvent): String {

val snapshot = db.collection("prefixes")
.document(messageCreateEvent.guildId.get().asString())
.get() //This returns a future
.get() //Retrieves the future's result (Blocks thread; IDE gives warning)

//Return the prefix
return if (snapshot.exists())
snapshot.getString("prefix") ?: DEFAULT_PREFIX
else DEFAULT_PREFIX
}
Решения, которые я рассмотрел
Первое, что я подумал, — это поискать в kotlinx.coroutine расширения, позволяющие соединить будущее. Хотя расширения существуют, они подходят только для CompletionStatge. Поэтому я решил обернуть будущее в один ()-

Код: Выделить всё

val snapshot = CompleteableFuture.supplyAsync {
db.collection("prefixes")
.document(messageCreateEvent.guildId.get().asString())
.get() // This returns a future
.get() // Get the result
}.await()
Я совершенно неопытен и не уверен, что это правильное решение. Я задал свой вопрос в сообществе программистов, и один человек порекомендовал мне использовать Deferred-

Код: Выделить всё

val deferred = CompletableDeferred()
val future = db.collection("prefixes")
.document(messageCreateEvent.guildId.get().asString())
.get()

future.addListener(
Runnable { deferred.complete(future.get()) },
ForkJoinPool.commonPool()
)

val snapshot = deferred.await()
Я потратил немало времени на поиск способа связать фьючерсы с сопрограммами, по SO даже нет подобного вопроса. Я не удивлюсь, если этот вопрос получит двойную оценку.


Подробнее здесь: https://stackoverflow.com/questions/633 ... the-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница между Job и Deferred в сопрограммах Kotlin
    Anonymous » » в форуме Android
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Каковы фактические правила для ожидания Final_suspend в сопрограммах C++?
    Anonymous » » в форуме C++
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Можем ли мы использовать alloca() или расширения массива переменной длины в сопрограммах C++20?
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Изменяйте слой QGIS каждые/через ~5 секунд (не блокируя основной поток)
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Изменяйте слой QGIS каждые/через ~5 секунд (не блокируя основной поток)
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»