美文网首页Kotlin协程
一学就会的协程使用——基础篇(二)线程切换

一学就会的协程使用——基础篇(二)线程切换

作者: TeaCChen | 来源:发表于2021-09-07 21:50 被阅读0次

1. 切换线程执行代码

本文内容很简单,主角即为withContext函数的用法!

前文介绍了怎么启动协程,这部分主要介绍在协程执行过程中切换线程去执行代码以及效果。

上代码:

GlobalScope.launch(Dispatchers.IO) {
    val msgIO = "coroutine runs in IO" // A
    myLog(msgIO)
    val ret = withContext(Dispatchers.Main) {
        val msgWithMain = "withContext in Main" // B
        myLog(msgWithMain)
    }
    myLog(ret) // C
}

这样一段代码,可以确保输出顺序必为 A-B-C而不会乱序!

具体的输出log内容如下:

D/chenhj: coroutine runs in IO ::running in Thread:[id:2886][name:DefaultDispatcher-worker-1]
D/chenhj: withContext in Main ::running in Thread:[id:2][name:main]
D/chenhj: withContext in Main ::running in Thread:[id:2886][name:DefaultDispatcher-worker-1]

注意,第三行日志输出,执行线程将回到了IO线程中。

同样的,可以先启动一个执行在主线程里的协程再切换到IO线程:

GlobalScope.launch(Dispatchers.Main) {
    val msgMain = "coroutine runs in Main"
    myLog(msgMain)
    val ret = withContext(Dispatchers.IO) {
        val msgWithIO = "withContext in IO"
        myLog(msgWithIO)
        msgWithIO
    }
    myLog(ret)
}

同样的,前后三处log输出顺序必然确定,如下:

D/chenhj: coroutine runs in Main ::running in Thread:[id:2][name:main]
D/chenhj: withContext in IO ::running in Thread:[id:2886][name:DefaultDispatcher-worker-1]
D/chenhj: withContext in IO ::running in Thread:[id:2][name:main]

2. 需要注意的点

简单点,需要有以下印象:

  • withContext是个挂起函数;
  • withContext必然有返回值,返回的内容是lambda表达式函数体中最后一个表达式的返回内容;
  • withContext本质上是挂起当前协程并启动新协程去执行逻辑,而不是调度协程到其他线程中;

挂起函数是协程非常核心的内容,后面内容会逐步介绍。

如对函数类型以及lambda表达式并不熟悉,建议自行熟悉学习了解Kotlin中函数式编程的相关设计,协程中的很多富有实用性和易用性的内容,都将与函数式编程中相关。

3. 样例工程代码

代码样例Demo,见Github:https://github.com/TeaCChen/CoroutineStudy

本文示例代码,如觉奇怪或啰嗦,其实为WithContextActivity.kt中的代码摘取主要部分说明,在demo代码当中,为提升细节内容,有更加多的封装和输出内容。

本文对应的页面截图如下:


image-2-1.png

一学就会的协程使用——基础篇

一学就会的协程使用——基础篇(一)协程启动

一学就会的协程使用——基础篇(二)线程切换(本文)

一学就会的协程使用——基础篇(三)初遇协程取消

一学就会的协程使用——基础篇(四)协程作用域

一学就会的协程使用——基础篇(五)再遇协程取消

一学就会的协程使用——基础篇(六)初识挂起

一学就会的协程使用——基础篇(七)初识结构化

一学就会的协程使用——基础篇(八)初识协程异常

一学就会的协程使用——基础篇(九)异常与supervisor

相关文章

  • 一学就会的协程使用——基础篇(二)线程切换

    1. 切换线程执行代码 本文内容很简单,主角即为withContext函数的用法! 前文介绍了怎么启动协程,这部分...

  • [Android] 深入理解Kotlin协程

    Kotlin协程 协程由程序自己创建和调度,不需要操作系统调度,所以协程比线程更加轻量。相比于线程的切换,协程切换...

  • kotlin协程

    协程基础 轻量级线程。在一个线程中可以启动多个协程。 在协程中使用同步方式写出异步代码(协程挂起时不会阻塞线程),...

  • 一学就会的协程使用——基础篇

    2021年了,还不知道协程是什么? 如果还在找千万种理由不用协程,相信将会逐渐被时代所抛弃。 学如逆水行舟,不进则...

  • Kotlin 协程

    协程 协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂...

  • 协程

    协程,又称微线程,纤程,协程是一种用户态的轻量级线程 协程是单线程 协程的好处: 1 没有上下文切换 ...

  • 一学就会的协程使用——基础篇(一)协程启动

    1. 启动一个协程 来,来启动第一个协程吧: 就这么简单,就可以在任意一个地方启动一个协程,而且这个协程必然会执行...

  • 初识协程

    一、添加依赖 kotlin协程是什么 kotlin封装的线程框架,方便进行线程切换 二、第一个协程程序 Globa...

  • greenlet和gevent的简单使用

    greenlet模块内部使用了协程的概念,在单线程内,我们需手动调用switch切换协程,使用方法如下 执行结果 ...

  • 协程

    协程与线程 线程的调度是由操作系统负责,协程调度是程序自行负责 与线程相比,协程减少了无谓的操作系统切换 协程实际...

网友评论

    本文标题:一学就会的协程使用——基础篇(二)线程切换

    本文链接:https://www.haomeiwen.com/subject/ikgswltx.html