Проблема в том, что vertx.dispatcher()
использует один поток в качестве цикла обработки событий, а runBlocking
блокирует этот поток.
Детали:
Ваша функция awaitBlockingExample()
работает в этом потоке цикла событий Vertx, поскольку она запускается из функции suspend start()
. Если вы вызываете runBlocking()
, этот поток Vertx блокируется и никогда не освобождается. Но ваши другие сопрограммы, например async()
, теперь нет потока, чтобы делать свою работу.
Решение:
Я предполагаю, что вызов awaitBlockingExample
из функции start
происходит только в этом примере. В действительности я бы предположил, что внешний обратный вызов использует свой собственный поток. Тогда нет никаких проблем, потому что теперь внешний поток заблокирован:
override suspend fun start() {
//simulate own thread for external callback
thread {
awaitBlockingExample()
}
}
fun awaitBlockingExample():String {
val future= async(vertx.dispatcher()) {
makeSuspendFunCall()
}
val result:String= runBlocking(vertx.dispatcher()){future.await()}
println(" The final Result is $result")
return result
}
Кстати: вам не нужен блок async()
, вы можете напрямую позвонить на makeSuspendFunCall()
с runBlocking()
fun awaitBlockingExample():String = runBlocking(vertx.dispatcher()){
val result = makeSuspendFunCall()
println(" The final Result is $result")
result
}