时间:2021-05-20
定义
Coroutine翻译为协程,Google翻译为协同程序,一般也称为轻量级线程,但需要注意的是线程是操作系统里的定义概念,而协程是程序语言实现的一套异步处理的方法。
在Kotlin文档中,Coroutine定义为一个可被挂起的计算实例,下面话不多说了,来一起看看详细的介绍吧。
配置
build.gradle中dependencies 添加下面2行,注意coroutine目前仍处于experiment阶段,但Kotline官方保证向前兼容。
dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.19.3" }实例
我们看一个简单Android示例:
activity_coroutine.xml
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".coroutine.CoroutineActivity"> <TextView android:id="@+id/tvHello" android:layout_width="wrap_content" android:layout_height="wrap_content" /></android.support.constraint.ConstraintLayout>CoroutineActivity.kt
class CoroutineActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_coroutine) setup() } fun setup() { launch(UI) { // launch coroutine in UI context for (i in 10 downTo 1) { // countdown from 10 to 1 tvHello.text = "Countdown $i ..." // update text delay(1000) // wait half a second } tvHello.text = "Done!" } }}运行程序 tvHello从10倒计时显示到1,最后显示"Done!"
代码分析:
我们重点分析setup()函数
看到这里你可能会疑惑,Android开发中不是禁止在主线程下做延迟或者阻塞操作吗?
我们回顾下Coroutine的定义:一个可被挂起的计算实例。
Coroutine不是线程,所以挂起Coroutine不会影响当前线程的运行。
取消Coroutine运行
我们修改下上面的代码:
class CoroutineActivity : AppCompatActivity() { lateinit var job:Job override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_coroutine) setup() } fun setup() { job = launch(CommonPool) { // launch coroutine in UI context for (i in 10 downTo 1) { // countdown from 10 to 1 tvHello.text = "Countdown $i ..." // update text delay(1000) // wait half a second } tvHello.text = "Done!" } } override fun onPause() { super.onPause() job.cancel() }}重点是 launch(UI)返回给一个job实例,通过job.cancel()取消coroutine。
Coroutine和thread关系
我们再分析下
launch(UI)这行代码是指将coroutine指派在UI线程上运行
当我们运行一段cpu耗时操作时,则需要将coroutine指定在非UI线程上。
我们写成:
launch(){...}这行代码等价于:
launch(CommonPool){...}我们分析下CommonPool的实现,发现它会根据当前cpu的核数创建一个线程池提供给Coroutine使用。
private fun createPlainPool(): ExecutorService { val threadId = AtomicInteger() return Executors.newFixedThreadPool(defaultParallelism()) { Thread(it, "CommonPool-worker-${threadId.incrementAndGet()}").apply { isDaemon = true } } } private fun defaultParallelism() = (Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)总结:
通过上面的分析,我们理解了Coroutine是一个运行在线程上的可被挂起的计算单元实例,对Coroutine的delay,cancel操作不会影响线程的运行,线程的状态变化对我们是透明的,我们不需要关心。
所以使用Coroutine,可以使我们更加方便得处理异步操作,比如网络请求,数据存储等。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Python协程yield与协程greenlet简单用法。分享给大家供大家参考,具体如下:协程协程,又称微线程,纤程。英文名Coroutine。协
协程协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存
异步编程工具在Android开发中目前最被推荐的就是Kotlin协程,在引入Kotlin协程机制前,除了响应式扩展(RxJava)兼任异步编程工具外,JavaA
前言Go语言比Java语言性能优越的一个原因,就是轻量级线程Goroutines(协程Coroutine)。本篇文章深入分析下Java的线程和Go的协程。协程是
本文实例讲述了PHP实现简单的协程任务调度。分享给大家供大家参考,具体如下:taskId=$taskId;$this->coroutine=$coroutine