挂起功能块主线程

时间:2019-03-05 20:09:28

标签: kotlin kotlin-android-extensions kotlin-coroutines

我很难理解协程。这是一个非常简单的设置。 longComputationdelay都是暂停函数。前一个阻塞主线程,后一个不阻塞。为什么?

CoroutineScope(Dispatchers.Main).launch {
    val result = longComputation() // Blocks
    delay(10_000) // Doesn't block
}

1 个答案:

答案 0 :(得分:3)

这取决于。 longComputation到底做什么? 当您将一个函数标记为suspend时,这并不意味着您不能在其中包含阻塞代码。例如,看看这个:

suspend fun blockingSuspendFunction(){
    BigInteger(1500, Random()).nextProbablePrime()
}

suspend函数中的代码显然是利用CPU并阻止调用者的东西。 按照惯例,不应执行此操作,因为如果调用暂停函数,则会期望使其阻塞线程:

  

惯例:挂起函数不会阻塞调用者线程。 (https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761

要使此类功能“具有挂起功能”,必须将阻塞分派到另一个工作线程上(建议),该工作线程应与withContext一起发生:

suspend fun blockingSuspendFunction() = withContext(Dispatchers.Default) {
    BigInteger.probablePrime(2048, Random())
}