Android Kotlin协程-线程切换
我是新手。我从报纸上读到的,发现了这张纸条 要点:使用使用使用线程池的调度程序,如 Dispatchers.IO或Dispatchers.Default不保证 块从上到下在同一线程上执行。在某些方面 在这种情况下,Kotlin协程可能会将执行移动到另一个线程 暂停并恢复后。这意味着线程局部变量可能 不指向整个withContext()块的相同值 但我没有得到这个具体的句子 这意味着线程局部变量可能 不指向整个withContext()块的相同值Android Kotlin协程-线程切换,android,multithreading,kotlin,kotlin-coroutines,Android,Multithreading,Kotlin,Kotlin Coroutines,我是新手。我从报纸上读到的,发现了这张纸条 要点:使用使用使用线程池的调度程序,如 Dispatchers.IO或Dispatchers.Default不保证 块从上到下在同一线程上执行。在某些方面 在这种情况下,Kotlin协程可能会将执行移动到另一个线程 暂停并恢复后。这意味着线程局部变量可能 不指向整个withContext()块的相同值 但我没有得到这个具体的句子 这意味着线程局部变量可能 不指向整个withContext()块的相同值 有人能给我举个例子吗 这是指线程的静态变量(请参阅
有人能给我举个例子吗 这是指线程的静态变量(请参阅以获取参考) 这很可能与您无关,线程局部变量的使用相当具体。在正常情况下,恢复时您的协同程序可能会跳转到不同的线程这一事实不会产生影响。
myLooper()
和Looper上的prepare()
使用线程局部变量来保存每个线程Looper
实例
那么,想象一下这个场景:
- 您可以
launch()
Dispatchers上的协同程序。默认值
- 在该协同程序中,您
准备()
一个活套
,并尝试将其用于某些事情(例如,使用信使
)
- 然后调用一些
suspend
函数
当该suspend
函数返回时,您可能与调用该suspend
函数之前所处的线程不同。它将是来自Dispatchers.Default
的线程,但不一定是您以前使用的特定线程。因此,您的活套
可能与其他线程关联,您正在与要使用的协程系统进行斗争。根据您在这里尝试执行的操作,您在不同线程上的事实可能会导致活套
的使用出现问题
这里真正的教训是:使用HandlerThread
获得活套
,而不是prepare()
他们试图表达的是,在withContext(IO){…}中,发生的不是。
IO->给我线程(A)->执行{…}->回到我身边
而是
IO->给我线程(A)->开始执行{…}~>如果遇到挂起~>就把工作放在一边~>来做点什么线程(B)也可能是线程(A)继续工作->返回一些结果
withContext(IO) { //starts executing on Thread A
println(currentThread().name //runs on Thread A
delay(100) //suspending put the work away
println(currentThread().name //picks up again on Thread B or A or C whatever
}
这在任何在多个线程上运行的异步代码中都是相同的问题。某些库(如rxjava)允许使工作变得有粘性。
Kotlin负责在上下文中移动局部变量,因此对于普通变量来说这不是问题。但是,如果您使用诸如日志记录UTIL之类的东西,将某些上下文信息存储在ThreadLocal中,那么这将无法按预期工作。withContext(IO){println(currentThread().name;delay(100);println(currentThread().name}
您可以替换currentThread()
用于任何其他ThreadLocal
支持的值。明白了,酋长(y)我想说@Transactional的用法是非常正常的,它使用ThreadLocal。