Kotlin 的协程是什么?
kotlin的协程和广义的协程不是一种东西,kotlin的协程(确切说是kotlin for Java的协程)是一个线程框架。
协程是什么?
1)协程是一种在程序中处理并发任务的方案,也是这种方案的一个组件。
2)它和线程属于一个层级的概念,是一种和线程不同的并发任务解决方案:一套系统(可以是操作系统,也可以是一种编程语言)可以选择不同的方案来处理并发任务,你可以使用线程,也可以使用协程。
那kotlin协程的代码怎么写?
用协程来开启后台任务(其实就是后台线程):
GlobalScope.launch{
println("coroutines camp1 ${Thrend.currentThrend().name}")
}
用协程来开启反复切换线程的任务:
Globalscope.launch(Dispatchers.Main){
ioCode1()
uiCode1()
ioCode2()
uiCode2()
ioCode3()
uiCode3()
}
private suspend fun ioCode1(){
withContext(Dispatchers.IO){
Thread.sleep(1000)
println("coroutines Camp io1 ${Thrend.currentThread().name}")
}
}
private suspend fun ioCode2(){
withContext(Dispatchers.IO){
Thread.sleep(1000)
println("coroutines Camp io2 ${Thrend.currentThread().name}")
}
}
private suspend fun ioCode3(){
withContext(Dispatchers.IO){
Thread.sleep(1000)
println("coroutines Camp io3 ${Thrend.currentThread().name}")
}
}
private fun uiCode1(){
println("coroutines Camp ui1 ${Thread.currentThread().name}")
}
private fun uiCode2(){
println("coroutines Camp ui2 ${Thread.currentThread().name}")
}
private fun uiCode3(){
println("coroutines Camp ui3 ${Thread.currentThread().name}")
}
写法总结:
1).用launch()来开启一段协程,一般需要指定Dispatchers.Main
2).把要在后台工作的函数,写成suspend函数,而且需要在内部调用其他suspend函数来真正切线程
3).按照一条线写下来,线程会自动切换
那如果用线程呢?怎么写呢?
倒是也能写:
thread{
ioCode1()
runOnUiThread{
uiCode1()
thread{
iocode2()
runOnUiThread{
uiCode2()
thread{
ioCode3()
runOnUiThread{
uiCode3()
}
}
}
}
}
}
看起来好复杂啊,算了还是kotlin简单
协程的额外天然优势: 性能
1).程序什么时候会需要切线程?
1.工作比较耗时:放在后台
2.工作比较特殊:放在指定线程---一般来说,是主线程
2).[ 耗时代码] 无法完美判断,导致程序的部分性能问题。
3).协程让函数的创建者可以对耗时代码进行标记(使用suspend关键字),从而所有耗时代码会100% 放在后台执行,这方面的性能问题被彻底解决。
4).不用协程为什么不行?
1.因为协程切换的关键点是【自动】【切回来】,而这两点需要给挂起函数提供充足的上下文,即【我应该往哪回】
2.这是直接使用线程无法做到的,或者说,非常难做到。
总结:
kotlin的协程是什么?
1).线程框架
2).可以用看起来同步的代码写出实质上异步的操作
1.关键亮点一:耗时函数自动后台,从而提高性能
2.关键亮点二:线程的【自动切回】
suspend关键字
1.并不是用来切线程的
2.关键作用:标记和提醒