持续创作,加速成长!这是我参与「掘金日新计划 · 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关闭,消耗资源,不太推荐使用。