Kotlin 协程 - 线程切换

the*_*e64 4 multithreading android kotlin kotlin-coroutines

我是Android Coroutines 的新手。我一直在从官方文档中阅读它并找到了这个注释

重要提示:使用使用像 Dispatchers.IO 或 Dispatchers.Default 这样的线程池的调度程序并不能保证块从上到下在同一个线程上执行。在某些情况下,Kotlin 协程可能会在挂起和恢复后将执行转移到另一个线程。这意味着线程局部变量可能不会指向整个 withContext() 块的相同值。

但我没有得到这个特定的句子

这意味着线程局部变量可能不会指向整个 withContext() 块的相同值

任何人都可以向我展示这种情况的示例吗?

Com*_*are 6

myLooper()prepare()Looper使用了保持每个线程的线程局部变量的Looper实例。

所以,想象一下这个场景:

  • launch()一个协程Dispatchers.Default
  • 在该协程中,您prepare()aLooper并尝试将其用于某事(例如,使用 a Messenger
  • 然后你调用一些suspend函数

当该suspend函数返回时,您可能与调用该suspend函数之前所在的线程不在同一线程上。它将是来自 的线程Dispatchers.Default,但不一定是您之前所在的特定线程。结果,您Looper可能与其他一些线程相关联,您正在与协程系统进行斗争以使用该线程。根据您在此处尝试执行的操作,您在不同线程上的事实可能会导致您想要的内容出现问题Looper

这里真正的教训是:使用HandlerThread获取Looper,而不是prepare()