Kun*_*uno 3 kotlin kotlin-android-extensions kotlin-coroutines
我很难理解协程。这是一个非常简单的设置。和longComputation都是delay挂起函数。第一个阻塞主线程,后者则不会。为什么?
CoroutineScope(Dispatchers.Main).launch {
val result = longComputation() // Blocks
delay(10_000) // Doesn't block
}
Run Code Online (Sandbox Code Playgroud)
那要看。具体是longComputation做什么的?当您将函数标记为 时suspend,这并不意味着您不能在其中包含阻止代码。例如,看一下这个:
suspend fun blockingSuspendFunction(){
BigInteger(1500, Random()).nextProbablePrime()
}
Run Code Online (Sandbox Code Playgroud)
挂起函数内的代码显然是利用CPU并阻塞调用者的东西。 按照惯例,不应这样做,因为如果您调用挂起函数,您希望它不会阻塞线程:
约定:挂起函数不会阻塞调用者线程。(https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761)
为了使这样的函数“表现为挂起函数”,必须将阻塞分派到另一个工作线程上,这(根据建议)应该发生在withContext:
suspend fun blockingSuspendFunction() = withContext(Dispatchers.Default) {
BigInteger.probablePrime(2048, Random())
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
861 次 |
| 最近记录: |