kotlin协程的创建方式
runBlocking{...} | 创建新的协程,运行在当前线程上,所以会堵塞当前线程, 直到协程体结束;但是这个runBlocking域中可以有多个协程, 多个协程可以并发进行,不会等待子协程执行结束 | 用于启动一个协程任务,通常只用于启动最外层的协程, 例如线程环境切换到协程环境 |
GlobalSocpe.launch{...} | 启动一个新的线程,在新线程上创建运行协程, 不堵塞当前线程 | 需要启动异步线程处理的情况 |
CoroutineScope(Dispathcer.xxx).{...} | 在指定类型的线程中创建协程,不会阻塞所运行的线程 |
1.GlobalScope.launch
val job = GlobalScope.launch {
// 启动一个非阻塞的协程,并返回了job
println("World!")
}
launch启动协程后返回一个Job代表当前协程的句柄,取消协程job.cancel(),cancel()会取消所有的子协程,子协程通过Job.attachChild关联到父协程的Job,通过Job可以管理协程的生命周期。
GlobalScope.launch(Dispatchers.IO) {
println("hello");
}
通过launch可以直接通过调度器Dispatchers来指定协程运行的线程,调度器可以指定的线程有
Dispatchers.Main:协程运行在主线程 Dispatchers.IO:协程运行在IO线程 Dispatchers. Default:协程运行在共享线程 Dispatcher.UnConfined:在父协程的线程中运行
2.GlobalScope.async
GlobalScope.async {
println("hello")
}
和launch一样,区别是返回一个Job的子类 Deferred
,async可以在协程体中自定义返回值,并且通过Deferred.await堵塞当前线程等待接收async协程返回的类型。特别是需要启动异步线程处理并等待处理结果返回的场景