协程的定义
协程可以理解为一种轻量级的线程。
协程和线程的区别是线程是依靠操作系统的调度才能实现不同线程之间的切换的,而协程可以在编程语言层面就能实现不同协程之间的切换,大大提升了并发编程的效率。
1.GlobalScope.launch创建的是顶层协程,当应用程序结束运行时,也会一起结束,所以下面的代码如果不写Thread.sleep那么协程里面的代码就不会打印。delay()函数可以挂起协程。
GlobalScope.launch {
println("codes run in coroutine scope")
delay(1500)
println("codes run in coroutine scope finished")
}
Thread.sleep(1000)
2.runBlocking所创建的协程,会阻塞当前线程,指导作用域内的所有代码和子协程都执行完毕。不过这个方法很影响性能,一般只在测试代码中使用
runBlocking {
println("codes run in coroutine scope")
delay(1500)
println("codes run in coroutine scope finished")
launch {
println("launch1")
delay(1000)
println("launch1 finished")
}
launch {
println("launch2")
delay(1000)
println("launch2 finished")
}
}
使用了suspend声明的方法才可以协程当中调用,但是不提供协程的作用域。
suspend fun printDot(){
println(".")
delay(1000)
}
3.coroutineScope函数也是一个挂起函数,并且可以继承外部的作用域同时创建一个子协程。也会挂起外部协程。
suspend fun printDot2()= coroutineScope {
launch {
println(".")
delay(1000)
}
}
Global.launch、runBlocking、launch、coroutineScope都可以创建一个新的协程,但是Global.launch、runBlocking是可以在任意地方调用的,coroutineScope可以在协程和挂起函数中调用,launch只能在协程作用域中调用
实际开发中基本上使用CoroutineScope来创建协程,因为方便控制
val job= Job()
val scope= CoroutineScope(job)
scope.launch {
}
scope.cancel()
4.async函数用来创建一个协程并且获得一个Deferred对象,然后调用await方法来获取执行结果。当调用await方法是会阻塞协程,直到async拿到了
fun main(){
runBlocking {
val result=async {
5+5
}.await()
println(result)
}
}