lag*_*ine 4 kotlin kotlin-coroutines
为了我自己的理解,我正在测试阻塞代码和协程如何交互。显然,我们应该使用非阻塞,但我想了解如果其中存在一些阻塞代码会发生什么。
如果我运行以下命令:
fun main() {
println("Start: ${Thread.currentThread()}")
runBlocking {
println("Run Blocking : ${Thread.currentThread()}")
launch(Dispatchers.D) { // Immediately scheduled for execution
println("Inside launch: ${Thread.currentThread()}")
}
Thread.sleep(10000)
println("Going to do some other stuff now")
}
println("Out of runBlocking")
}
Run Code Online (Sandbox Code Playgroud)
一切都在同一个协程中运行,Inside launch:直到完成后才会出现Thread.sleep。我认为这是因为它是阻塞的,所以不会发生挂起或使用另一个协程的情况。
如果我传递Dispatchers.Default到launch(我认为Dispatchers.Default默认情况下使用启动,如果您没有指定的话?),启动块在单独的协程中运行并立即启动。
那么,为什么launch(Dispatchers.Default)允许第二个协程启动,为什么不呢launch?
我认为启动默认使用 Dispatchers.Default,如果您没有指定的话
这就是你误会的地方。这是文档:
协程上下文继承自 CoroutineScope。可以使用 context 参数指定其他上下文元素。如果上下文没有任何调度程序或任何其他 ContinuationInterceptor,则使用 Dispatchers.Default。
这意味着,如果您不将调度程序传递给,它将默认为您启动该 的launch上下文中存在的调度程序。如果协程上下文没有调度程序,则将使用.CoroutineScopelaunch launchDispatchers.Default
因此,在您的情况下,无参数launch继承上下文,从而继承由 提供的调度程序runBlocking,这是一个在它阻止的线程(此处的主线程)上运行的单线程调度程序。
为什么
launch(Dispatchers.Default)允许第二个协程启动,为什么不允许启动launch?
这是因为,正如我们刚刚看到的,这两种情况不涉及相同的线程。使用launch(Dispatchers.Default),启动的协程在单独的线程池上运行,并且可以与主线程并行运行。但是,对于无参数launch,第二个协程与其余代码在同一线程上运行,因为它在 的单线程调度程序中运行runBlocking,该调度程序由主线程支持。
难题的最后一部分是Thread.sleep阻塞(正如您所说),与delay协程库中的挂起等效项不同。当只涉及一个线程时(在无参数的情况下launch),运行最后一个Thread.sleep线程会阻塞主线程,并且永远不会给其他协程运行的机会。例如,您需要一些东西来暂停执行delay()。
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |