协程
协程 的定位 是kotlin 为了简化 异步编程 而设计的。
在学习相关关键字之前咱们先 了解一些 协程 相关的 重要概念。
首先 第一点需要记住的就是 在 没有协程之前, 在Java中 我们通过 充分的利用 线程 级别的资源, 来充分的 利用底层资源, 比如CPU资源, CPU 多核的情况, 通过线程间的切换 来提高CPU资源的利用率, 然后通过 线程池 来管理 线程, 通过锁机制来确保 安全。 但是 假如 在一个线程 可能遇到了 IO操作的 时候, 在 这个IO操作 执行完 的这段时间, 实际上 这个线程 资源是被浪费的,
而 协程 的定位 就是为了 把这一段 等待的时间, 利用起来 ,
在 Java 中 一个请求 进来, 一般会分配一个线程 处理这个请求 。 即 主线程
然后去执行任务 A,B,C 如果B是一个阻塞性的任务 比如IO操作, 线程就会阻塞。
在Kotlin 中 咱们就可以创建一个协程 来执行 任务 A, B, C
当然执行的时候 协程 还是需要 绑定一个线程 来帮助他执行实际的任务, 但是假如 到了 B阻塞了。
协程 会自动的 把 这个线程释放出来 给别人去用 (我们一般专业一点管这个叫做挂起 英文 suspend) 这样就能把这部分资源 利用起来了。
所以 记住 协程 实际上就是搭建在 线程基础上的 更轻量的 任务调度和编排框架。

挂起函数
挂起函数是一切的基石, 只有用suspend 修饰的函数 且 这个函数里头 真正调用了其他挂起函数比如 delay 函数 , 挂起 的动作才会 生效。
如果你是后端开发者或好奇后端用法:可以知道,在后端典型用法是:每个HTTP请求都包裹在一个协程里处理。当这个协程执行到suspend函数(如查询数据库)时,它会挂起并释放底层线程,这个线程立刻可以去处理其他到达的请求。这样,用几十个线程就能轻松处理成千上万的并发连接。
协程作用域 (CoroutineScope)
呐, 还有一个重要的 东西叫做协程作用域。
首先, 我们知道 线程有线程池来管理, 那么 协程 肯定也需要一个管家, 一种管理机制。
而 协程作用域 就是那个管家, 在创建 协程 之前, 必须先有一个管家。
在管家创建之后, 我们创建出协程, 就可以给他绑定这个管家, 由这个协程 衍生出的 所有子协程 都会受这个 管家 管理, 当 管家 说 停止执行的时候 , 所有由这个管家 管理的 协程 就都得停止。
这种 一个 CoroutineScope 管理一个协程树(或协程组), 通过这种树形结构,才能实现"取消父协程/作用域,所有子协程自动取消"的关键特性 。 这也是后面 另一个概念 结构化并发的 实现基础
