因此,第一次查看协程,我想并行处理数据加载并等待其完成。我环顾四周,看到RunBlocking和Await等,但不确定如何使用它。
我到目前为止有
val jobs = mutableListOf<Job>()
jobs += GlobalScope.launch { processPages(urls, collection) }
jobs += GlobalScope.launch { processPages(urls, collection2) }
jobs += GlobalScope.launch { processPages(urls, collection3) }
然后,我想知道/等待这些完成
最佳答案
如果使用结构化并发概念,则无需手动跟踪并发作业。假设processPages
函数执行某种阻塞的IO,则可以将代码封装到以下挂起函数中,该函数在为此工作而设计的IO调度程序中执行代码:
suspend fun processAllPages() = withContext(Dispatchers.IO) {
// withContext waits for all children coroutines
launch { processPages(urls, collection) }
launch { processPages(urls, collection2) }
launch { processPages(urls, collection3) }
}
现在,如果应用程序的最高功能还不是挂起功能,则可以使用
runBlocking
调用processAllPages
:runBlocking {
processAllPages()
}
关于Kotlin协程: Waiting for multiple threads to finish,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54854187/