不复杂, 代码即注释

    1. import kotlinx.coroutines.*
    2. import java.util.concurrent.Executors
    3. private fun isTrue(f: Boolean) {
    4. if(!f) throw Exception("not eq")
    5. }
    6. fun main() {
    7. val executor = Executors.newSingleThreadExecutor()
    8. val co = CoroutineScope(executor.asCoroutineDispatcher())
    9. val TL = ThreadLocal<Int>()
    10. TL.set(1)
    11. co.launch {
    12. val thread = Thread.currentThread()
    13. println("离开main线程, 任务将运行在executor中")
    14. println("TL值为null")
    15. isTrue(TL.get() == null)
    16. println()
    17. TL.set(1)
    18. isTrue(TL.get() == 1)
    19. println("第一个协程中, TL值为1")
    20. co.launch {
    21. isTrue(Thread.currentThread() == thread)
    22. isTrue(TL.get() == 1)
    23. println("不同的协程, 运行在同一个线程中, TL值会混乱")
    24. println("第二个协程中, TL值也为1, 修改为2")
    25. TL.set(2)
    26. }.join()
    27. println("第二个协程执行完毕, TL的值为2, 但正确情况下, 这里应为1")
    28. isTrue(TL.get() == 2)
    29. println("\n")
    30. co.launch(TL.asContextElement(value = 3)) {
    31. isTrue(TL.get() == 3)
    32. println("第三个协程中, 指定协程上下文, TL值为3")
    33. co.launch {
    34. isTrue(TL.get() == 2)
    35. println("第四个协程中, TL值仍为之前的2")
    36. }
    37. co.launch(currentCoroutineContext()) {
    38. isTrue(TL.get() == 3)
    39. println("第五个协程中, TL值保留为3, 修改为4")
    40. TL.set(4)
    41. }
    42. }.join()
    43. println("第三个协程执行完毕, TL值不为4 也不为3, 仍是之前的2")
    44. isTrue(TL.get() == 2)
    45. }
    46. }ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss