IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin 协程的suspend关键字到底有什么作用?进来看实验 -> 正文阅读

[移动开发]Kotlin 协程的suspend关键字到底有什么作用?进来看实验

作者:>

不久前收到一个粉丝的提问,今天深海就来通过实验告诉大家?suspend?关键字到底有什么用。

首先这是测试代码:

build.gradle:

    //协程
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
/**
 * author:xingHai.zhao(CSDN-深海呐)
 * duty: 协程举例
 */
@ExperimentalCoroutinesApi
fun main(args: Array<String>) {
    Test().test()
}

class Test {

    @ExperimentalCoroutinesApi
    fun test() {
        Thread {
            println("进入线程")
            GlobalScope.launch(Dispatchers.Unconfined) {
                println("协程1开始执行了!!!")
                timeConsuming()
            }
            println("到达线程中间")
            GlobalScope.launch(Dispatchers.Unconfined) {
                println("协程2开始执行了!!!")
            }
            while (true) {
                //模拟安卓主线程,防止线程死亡
            }
        }.start()
    }

    /**
     * author:xingHai.zhao
     * duty:模拟耗时方法
     */
    private suspend fun timeConsuming() {
        println("进入耗时任务,并遇到阻塞 -- -- -- ")
        delay(100)
        println("耗时任务开始执行 -- -- -- ")
    }
}

大概说一下这个代码做了什么:

开启一个线程,运行两个协程。

其中第一个协程调用了耗时方法 timeConsuming(),且该方法使用suspend修饰。

运行结果:

?怎么样?是不是有些诧异?

当协程1中的耗时任务遇到阻塞后,竟然直接去执行协程外的任务了。

并且协程2执行完之后又接着执行了协程1中后续耗时任务。

suspend功能总结:? ? ?

那么集合上诉运行结果,suspend的功能显而易见。

当携程遇到阻塞方法时,如果该方法由suspend修饰,那么当前携程将进入挂起状态,

线程将跳过已挂起的携程,继续执行后面的任务,

当前面携程挂起状态结束后,线程将继续执行被挂起的线程后续的任务。(前提是这时候线程还存活)

为什么代码中有 while (true) 这个无限循环?

假如没这个循环的话,运行结果如下:

你会发现阻塞后的任务没有执行,因为线程死掉了。

这个 while (true) 可以保证线程不死,安卓主线程的 Handler原理亦是通过Loop的无限循环来保证主线程不死。

复制样例代码 运行出错?

如果你的报错是这个的话:

这样解决:

解决:Command line is too long. In order to reduce its length classpath file can be used._愿我如星君如月 ... 夜夜流光相皎洁 ...-CSDN博客


好了,文章到这里就结束了,如果您有不同的见解或者有疑问的话欢迎到评论区留言。

如果您感觉深海写的不错的话,请给文章点个赞吧,感谢各位的支持!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:19:09  更:2022-03-17 22:20:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:53:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码