kotlin 的协程是什么?

375 阅读2分钟

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.关键作用:标记和提醒

此文章只能用学习,好看的给个赞或者关注