美文网首页
kotlin 携程学习笔记(一)协程简介

kotlin 携程学习笔记(一)协程简介

作者: bridegg | 来源:发表于2022-01-20 17:15 被阅读0次

    协程概念

    协程首先不是一个线程或者进程,是一个新的概念,不可以用线程或者进程混淆,可以理解为具有挂起功能的函数调用(因为携程可以在自己控制切换上下文)
    kotlin中协程大多指的是在kotlinx.coroutines扩展包中的携程库

    协程的启动方式

    协程的启动方式

    1·GlobalScope.launch

    GlobalScope:A global CoroutineScope not bound to any job.
    没有绑定任何协程作用域的协程
    launch:Launches a new coroutine without blocking the current thread
    启动一个不阻塞线程的协程

    使用方式如下:

    GlobalScope.launch {
             //执行代码块
            }
    

    2·runBlocking

    Runs a new coroutine and blocks the current thread interruptibly until its completion
    启动一个直到执行完毕都会阻塞当前线程的协程
    使用代码如下

    fun doCoroutine()=runBlocking {
                  //执行代码块
            }
    
    fun doCoroutine(){
          runBlocking {
             //执行代码块
            }
    }
    
    

    3·CoroutineScope.launch

    Launches a new coroutine without blocking the current thread
    启动一个不阻塞线程的协程
    但是由于该方法是CoroutineScope的扩展函数,所以一般在协程作用域中可以直接调用launch启动,一般用于子携程或者当前作用域协程,可以理解GlobalScope.launch 是该方法的特殊扩展方法,相当于子类的launch方法

    fun doCoroutine()=runBlocking {
                 launch{
                }
       }
    
    
    public fun CoroutineScope.launch(_,_,_): Job {
      ...
        return coroutine
    }
    
    public object GlobalScope : CoroutineScope {
        /**
         * Returns [EmptyCoroutineContext].
         */
        override val coroutineContext: CoroutineContext
            get() = EmptyCoroutineContext
    }
    

    4·coroutineScope{} 和 CoroutineScope()

    先看runBlocking的入参和launch的入参(省略版)

    public fun <T> runBlocking(_, block: suspend CoroutineScope.() -> T): T {
        val coroutine = BlockingCoroutine<T>(newContext, currentThread, eventLoop)
        coroutine.start(CoroutineStart.DEFAULT, coroutine, block)
        return coroutine.joinBlocking()
    }
    
    public fun CoroutineScope.launch(_,  _,  block: suspend CoroutineScope.() ->Unit): Job {
        coroutine.start(start, coroutine, block)
        return coroutine
    }
    
    

    block在两个函数入参中都是一个CoroutineScope的扩展方法,所以coroutineScope{}是在协程作用域中当构建器用的
    代码执行方法

    fun doCoroutine()=runBlocking {
                 coroutineScope{
                }
       }
    
    CoroutineScope(EmptyCoroutineContext).launch {  }
    
    

    还有几种以后再说

    关键字 suspend

    suspend关键字使用来标识协程方法的前缀
    所有因为在launch和runBlocking的入参block中都被suspend修饰了,所以可以理解为一个在协程作用域中执行的方法都需要被suspend修饰。

      fun doCoroutine() = runBlocking {
            launch (block = block)
            coroutineScope(block = block)
        }
    
      var block: suspend CoroutineScope.() -> Unit =
            {
    
            }
    

    Job 任务管理

    通过GlobalScope.launch 或者runblocking创建的协程都会返回一个Job类型,Job是给协程使用者提供管理协程的封装体,包括启动,取消等等操作这里就不一一记录

    Dispatchers 协程调度器

    Dispatchers.Default

    默认调度 它由JVM上的共享线程池支持。默认情况下,此调度程序使用的最大并行级别等于CPU内核数,至少为两个( 机翻)

    Dispatchers.Main

    主线程

    Dispatchers.IO

    任务线程 和Default 公用一个线程池

    newSingleThreadContext

    独立线程,最好能管理生命周期

    Unconfined

    用于嵌套调度,类似想做个递归(求大神指点)

    启动模式

    launch的start参数 有四种类型

    DEFAULT

    默认,不传或传入此参数会立即执行协程

    LAZY

    launch后不立即执行,需要获取其job发起执行

    ATOMIC

    执行前不可取消的

    UNDISPATCHED

    在当前线程立即执行
    使用方法

    runBlocking {
            launch ( CoroutineStart.DEFAULT)
        }
    

    以上都是协程的基本概念

    相关文章

      网友评论

          本文标题:kotlin 携程学习笔记(一)协程简介

          本文链接:https://www.haomeiwen.com/subject/nqpjhrtx.html