不久前收到一个粉丝的提问,今天深海就来通过实验告诉大家 suspend 关键字到底有什么用。
首先这是测试代码:
build.gradle:
//协程
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
/**
* author:xingHai.zhao(CSDN-深海呐)
* duty: 协程举例
*/
@ExperimentalCoroutinesApi
fun main(args: Array) {
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博客
好了,文章到这里就结束了,如果您有不同的见解或者有疑问的话欢迎到评论区留言。
如果您感觉深海写的不错的话,请给文章点个赞吧,感谢各位的支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)