【发布时间】:2022-02-01 15:01:24
【问题描述】:
我正在学习 kotlin 协程和作用域,无法理解如何通过不阻塞主线程来触发并行调用。正如您在以下示例中看到的,2 个调用是并行触发的,但是对 .awaitAll() 的调用似乎阻塞了主线程,因为我希望在“1.Current 线程”之前打印“我被阻止的消息” ...“ 信息。这是实现此类查询的正确方法吗?
当前输出:
主线程 main
...(5 秒后)...
1.当前线程 DefaultDispatcher-worker-1
1.当前线程 DefaultDispatcher-worker-3
我被屏蔽了
预期输出:
主线程 main
我被屏蔽了
...(5 秒后)...
1.当前线程 DefaultDispatcher-worker-1
1.当前线程DefaultDispatcher-worker-3
class FindItinerariesComposable(private val providers: List<FindItineraries>) : FindItineraries {
override suspend fun itinerariesForOriginDestination(origin: String, destination: String): List<Itinerary> {
println("Main thread ${Thread.currentThread().name}")
return coroutineScope {
val stream = providers.stream()
.map {
async {
it.itinerariesForOriginDestination(origin, destination)
}
}
.toList()
.awaitAll()
.flatten()
println("I'm blocked")
stream
}
}
}
class FindItinerariesInFlightProvider(private val httpClient: HttpClient) : FindItineraries {
override suspend fun itinerariesForOriginDestination(origin: String, destination: String): List<Itinerary> {
withContext(Dispatchers.IO) {
delay(5000)
println("1.Current thread ${Thread.currentThread().name}")
}
return listOf(Itinerary("bue", "MIA", "TEST"))
}
}
fun main() = runBlocking<Unit> {
val service = FindItinerariesComposable(listOf(FindItinerariesInFlightProvider(HttpClient()),
FindItinerariesInFlightProvider(HttpClient())))
launch {
service.itinerariesForOriginDestination("BUE", "MIA")
}
}
【问题讨论】:
标签: multithreading kotlin-coroutines