diff --git a/language/kotlin/Kotlin协程.md b/language/kotlin/Kotlin协程.md index 9964a45..cc8fbb0 100644 --- a/language/kotlin/Kotlin协程.md +++ b/language/kotlin/Kotlin协程.md @@ -1 +1,50 @@ -# Kotlin协程从入门到入土 \ No newline at end of file +# Kotlin协程从入门到入土 + +## 0x00 什么是协程 +协程,英文Coroutines,是一种比线程更加轻量级的存在。 + +协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。 + +协程已经在Python、JS等许多编程语言上有所实现,一般情况下,协程被认为是比线程更轻量级的异步事件处理方式,所谓协程,是在编程语言层面上对同时执行多个异步任务上的实现。 + +> 协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。 +> +> 协程是一种并发设计模式,您可以在Android平台上使用它来简化异步执行的代码 + +简单来说,协程可以帮助开发者以同步方式编写异步代码,解决以往编写异步程序时出现的“回调地狱”的问题。 + +## 0x11 Kotlin上协程的分类 + +### 创建最简单的协程 + +先上代码: +```Kotlin + // 调用阻塞式协程 + runBlocking { + Log.d("runBlocking", "启动一个协程") + } + + // 调用launch启动协程 + GlobalScope.launch { + Log.d("launch", "启动一个协程") + } + + // 调用async启动协程 + GlobalScope.async { + Log.d("async", "启动一个协程") + } +``` +如上面代码所示,Kotlin中创建启动协程主要有3种方式: +1. runBlocking - 启动一个阻塞式协程,协程体代码块内代码会阻塞所在线程,返回值为泛型T,就是在协程体内最后一行返回的数据类型 +2. launch - 启动一个非阻塞式协程,必须在协程作用域(CoroutineScope)内启动,但不会阻塞所在线程,返回值为Job +3. async - 启动一个非阻塞式协程,必须在协程作用域(CoroutineScope)内启动,但不会阻塞所在线程,返回值为一个Deferred,T泛型为协程体内最后一行返回的数据类型 + +- 协程的返回类型 +1. runBlocking的泛型返回值T +runBlocking在默认情况下类似于一个封装好的方法,当然可以通过指定该方法运行的线程,让这个方法不阻塞主线程,这样就类似于我们在Java中的Thread,并且将run方法执行的结果最终返回回来,这里不做过多讨论。 + +2. launch的返回类型Job +3. async的返回类型Deferred + + + \ No newline at end of file