不复杂, 代码即注释
import kotlinx.coroutines.*
import java.util.concurrent.Executors
private fun isTrue(f: Boolean) {
if(!f) throw Exception("not eq")
}
fun main() {
val executor = Executors.newSingleThreadExecutor()
val co = CoroutineScope(executor.asCoroutineDispatcher())
val TL = ThreadLocal<Int>()
TL.set(1)
co.launch {
val thread = Thread.currentThread()
println("离开main线程, 任务将运行在executor中")
println("TL值为null")
isTrue(TL.get() == null)
println()
TL.set(1)
isTrue(TL.get() == 1)
println("第一个协程中, TL值为1")
co.launch {
isTrue(Thread.currentThread() == thread)
isTrue(TL.get() == 1)
println("不同的协程, 运行在同一个线程中, TL值会混乱")
println("第二个协程中, TL值也为1, 修改为2")
TL.set(2)
}.join()
println("第二个协程执行完毕, TL的值为2, 但正确情况下, 这里应为1")
isTrue(TL.get() == 2)
println("\n")
co.launch(TL.asContextElement(value = 3)) {
isTrue(TL.get() == 3)
println("第三个协程中, 指定协程上下文, TL值为3")
co.launch {
isTrue(TL.get() == 2)
println("第四个协程中, TL值仍为之前的2")
}
co.launch(currentCoroutineContext()) {
isTrue(TL.get() == 3)
println("第五个协程中, TL值保留为3, 修改为4")
TL.set(4)
}
}.join()
println("第三个协程执行完毕, TL值不为4 也不为3, 仍是之前的2")
isTrue(TL.get() == 2)
}
}ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss