协程 文档阅读笔记(上)

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

  • 协程是轻量级的线程
  • GlobalScope.launch { }:在后台开启一个顶层协程
  • delay(1000L):非阻塞等待一秒钟(挂起,释放线程等待直到计时结束,再持有线程继续)
  • Thread.sleep(1000L):阻塞当前线程等待一秒钟(持有线程等待直到计时结束)
  • runBlocking<Unit>{}:调用runBlocking{}会一直阻塞直到runBlocking{}内部协程执行结束
  • fun test()=runBlocking{}:直接将函数test()转化为协程
  • 在全局协程GlobalScope中启动的协程就像守护线程
  • 如果协程正在执行计算任务,并且没有检查取消的话,那么它是不能被取消的
runBlocking{
  //启动一个协程
  launch{}
  //启动一个协程并保持对这个协程的引用
  val job=launch{}
  //延时1000ms
  delay(1000L)
  //等待直到这个协程执行结束
  job.join()
  //取消协程
  job.cancel()
  //取消一个协程并等待结束
  job.cancelAndJoin()
  //检查当前协程状态
  val result=isActive
  //启动一个协程(带返回结果)
  val deferred=async{}
  //等待协程执行完成返回结果
  val result=deferred.await()
  //创建一个惰性启动的协程
  val deffered2=async(start=CoroutineStart.LAZY){}
  deffered2.start() //显示启动协程
  defferd2.warit()  //显示启动协程
}
协程构建器launch和async的异同:

都是启动一个协程,可以对该协程进行等待执行完成和取消。 launch返回一个Job,不附带任何返回值; async返回一个Deferred,提供结果promise,可以使用awai()得到最终结果。

协程调度器CoroutineDispatcher
  • launch{} :接收一个空的调度器,协程上下文继承自调用者的上下文
  • launch(Dispatchers.Unconfined):非受限调度器,协程上下文继承自调用者的上下文,运行在主线程中。适用于执行不消耗时间的任务,以及不更新局限于特定线程的共享数据(如UI)的协程。
  •  (Dispatchers.Default){} :获取默认调度器
  •  launch(newSingleThreadContext("Test")):为该协程启动一个新线程Test,使用完后使用close关闭,消耗资源,不太推荐使用。