不复杂, 代码即注释
import kotlinx.coroutines.*import java.util.concurrent.Executorsprivate 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
