kotlin 协程上下文和调度器

 //1.调度器 协程构造器(协程调度器) 将协程分派到线程中运行
    fun mainDispatcher()= runBlocking {
        launch {
            println("launch ${Thread.currentThread().name} ..")//主线程
        }
        launch(Dispatchers.Unconfined) {
            println("Unconfined ${Thread.currentThread().name} ..")//主线程 它是一种不同的机制
        }
        launch(Dispatchers.Default) {
            println("Default ${Thread.currentThread().name} ..")//后台线程池
        }
        launch(newSingleThreadContext("newSingleThreadContext")) {
            println("thread  ${Thread.currentThread().name} ..")//创建新线程
        }
    }
    //2.调度器在调用者线程中启动一个协程,但它仅仅只是运行到第一个挂起点。
    // 在挂起之后,它将恢复线程中的协程,该协程完全由调用的挂起函数决定
    //调度器是默认继承于外部的协程作用域的
    fun mainUnconfined()= runBlocking {
        launch(Dispatchers.Unconfined) {
            println("Unconfined ${Thread.currentThread().name} ..")//主线程
            delay(1000)
            println("Unconfined ${Thread.currentThread().name} ..end")//线程池
        }
        launch {
            println("launch ${Thread.currentThread().name} ..")//主线程
            delay(1000)
            println("launch ${Thread.currentThread().name} ..end")//主线程
        }
    }
    //3.调试
    fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")//打印线程名
    fun mainLog()= runBlocking {
       var a=async {
           delay(1000)
           log("a协程")
           1
       }
        var b=async {
            delay(2000)
            log("b协程")
            2
        }
        log("a+b=${a.await()+b.await()}")
    }
    //4.在线程间切换
    fun mainwithContext() {
        newSingleThreadContext("Ctx1").use { ctx1 ->
            newSingleThreadContext("Ctx2").use { ctx2 ->
                runBlocking(ctx1) {//对显示指定的上下文使用 runBlocking
                    log("Started in ctx1")//[Ctx1] Started in ctx1
                    withContext(ctx2) {//更改协程的上下文并同时仍然保持在另一个协程中
                        log("Working in ctx2")//[Ctx2] Working in ctx2
                    }
                    log("Back to ctx1")//[Ctx1] Back to ctx1
                }
            }
        }//use 在不再需要时释放 newSingleThreadContext 所创建的线程
    }
    //5.子协程
    fun mainChildren_coroutine()= runBlocking {
       val facher=launch {
             GlobalScope.launch {// GlobalScope 启动协程 协程的 Job 没有父级,所以不受其启动的作用域和独立运作范围的限制
                 println("GlobalScope ..")
                 delay(1000)
                 println("GlobalScope ..end")
             }
           launch {
               delay(100)
               println("launch ..")
               delay(1000)
               println("launch ..end")
           }
       }
        delay(500)
        facher.cancel()//当父协程取消 子协程也被取消 launch的协程没有运行完
        delay(1000)
        println("facher ..end")
    }
    //6.父协程
    fun mainfacher_coroutine()= runBlocking {
        val facher=launch {
            GlobalScope.launch {// GlobalScope 启动协程 协程的 Job 没有父级,所以不受其启动的作用域和独立运作范围的限制
                println("GlobalScope ..")
                delay(1000)
                println("GlobalScope ..end")
            }
            launch {
                delay(100)
                println("launch ..")
                delay(1000)
                println("launch ..end")
            }
        }
        delay(500)
//        facher.join()//当父协程会等待子协程完才结束 launch的协程运行完
        delay(1000)
        println("facher ..end")
    }
    //7.协程命名以便调试
    fun maincoroutine_name()= runBlocking(CoroutineName("main")) {
        log("Started")
        val a=launch(CoroutineName("a")) {
                delay(1000)
              log(" a..")
        }
        val b= launch(CoroutineName("b"))  {
            delay(1000)
            log(" ..b")
        }
        println(" ..end")
    }
   //8.协程命名以便调试
   fun mainCoroutineName()= runBlocking() {
      launch(Dispatchers.Default+ CoroutineName("test")) {
          println("thread is ${Thread.currentThread().name}")
      }
       println(" ..end")
   }
    //9.线程局部数据 ThreadLocal
    fun mainThreadLocal()= runBlocking() {
        val threadLocal=ThreadLocal<String>()
        threadLocal.set("main")
        println("当前线程: ${Thread.currentThread()},threadLocal的值: '${threadLocal.get()}'")
        val job = launch(Dispatchers.Default+ threadLocal.asContextElement(value = "launch")) {
            println("Launch 当前线程: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'")// DefaultDispatcher-worker-1,5,main launch
            yield()
            println("yield, 当前线程: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'")// DefaultDispatcher-worker-1,5,main launch
        }
        job.join()
        println("end .. current thread: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'") //Thread[main,5,main]    'main'
        job.cancel()
    }
    //10 协程作用域
    fun mainCoroutinescope() = runBlocking<Unit> {
        val activity = ActivityTest()
        activity.doSomething() //运行
        println("销毁...")
        activity.destroy()
        delay(1000) //销毁后,不再打印
    }
ActivityTest类
//用于  10 协程作用域的
class ActivityTest : CoroutineScope by CoroutineScope(Dispatchers.Default) {//实现 CoroutineScope接口 默认工厂函数使用委托
    fun destroy() {
        cancel() // 扩展于CoroutineScope
    }
    fun doSomething() {
        // repeat来自CoroutineScope的
        repeat(10) { i ->
            launch {
                delay((i + 1) * 200L) // variable delay 200ms, 400ms, ... etc
                println("Coroutine $i is done")
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值