0%

Kotlin-协程为线程框架而生?

Kotlin-协程为线程框架而生?

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 1 天,点击查看活动详情

前言

笔者在开始学习 Kotlin 协程时,在网上经常看到 “Kotlin 协程是一种线程框架” 这种说法,当时认为这种说法好牛逼,协程比线程更厉害,性能肯定比线程更好,此一时彼一时,现在我对这种说法不敢苟同。

为线程框架而生?

这里不妨再问一下,何为框架?我们一直在说的各种开发框架,甚至自己开发一个框架,比如在 Android 中使用 MVP + Retrofit 搭建开发框架,可能我们更多关注使用框架,而忽略了什么是框架。

计算机编程中,软件框架是一种抽象,其中提供通用功能的软件可以通过其他用户编写的代码有选择地更改,从而提供特定于应用程序的软件。它提供了一种构建和部署应用程序的标准方法,并且是一个通用的、可重用的软件环境,它提供特定功能作为更大软件平台的一部分,以促进软件应用程序、产品和解决方案的开发。软件框架可能包括支持程序、编译器、代码库、工具集和应用程序编程接口 (API),它们将所有不同的组件组合在一起,以实现项目系统的开发。[1]

以上对「软件框架」的描述摘自维基百科,是不是感到比较模糊,这啥?

对每个人来说,对框架的理解、划分都是不一样的,或许我们认为 OkHttp 是一个网络请求框架,Retrofit 基于 OkHttp 也是一个框架,Android 系统也是一个框架。

框架有大有小,但总的来说,框架是一种半成品,为了实现某种功能,提供一些基础通用的组件,比如 Android 为开发者提供 SDK 开发工具包,我们可以利用 SDK 开发自己的 App,实现自己的业务逻辑。

哪什么是线程框架呢?对线程框架的理解,也是仁者见仁,智者见智,或许你认为 Executor 是一种线程框架,在使用时不用关心什么时候启动线程,线程什么时候结束,只要执行 execute 即可,或许你认为 RxJava 也是一种线程框架,在使用时可以使用操作符方便的切换线程。

上述举例的 ExecutorRxJava 有个共同点:它们都可以切线程,那我们是不是可以理解为:能切线程就是线程框架呢?我如果问你 Handler 也能切线程,你认为 Handler 也是线程框架么?

Handler 的作用是什么? Handler 主要用于消息处理,消息可能来自主线程,也可能来自子线程,来自子线程时,势必涉及线程之间的切换,所以笔者认为 Handler 不是线程框架,而是一个消息处理框架,只是提供了切线程的方法。

回过头来,我们再看 Kotlin 协程的作用是什么,或者说 Kotlin 协程用来解决什么问题。笔者认为 Kotlin 协程可以用来解决回调地狱,把异步调用写成同步调用的形式,一种异步转同步的编程思想,而异步调用可能涉及线程切换,正好 Kotlin 协程提供了切线程的方法。

说到异步调用,你不切线程咋异步调用呢?想想在 Android 中,你在 Activity#onResume 中使用 handlper.post 一个 Runnable, 这个 Runnable 的执行有切换线程么?

1
2
3
4
5
6
override fun onResume(){
super.onResume()
handler.post {
// Do something
}
}

总结

Kotlin协程是一个回调框架,它可以使异步代码同步化,同时提供结构化并发的特性,使并发代码简洁化,同时也提供了切换线程的能力,方便写出高效的异步和并发代码。

说明

以上为笔者个人见解,仁者见仁,智者见智,大家可以求同存异,同时笔者水平有限,如有错误之处,欢迎交流。

参考文献


  1. 软件框架 ↩︎

欢迎关注我的其它发布渠道