如何创建并使用一个协程:对比runBlocking、Global

2022-09-01  本文已影响0人  我爱田Hebe

本文概览:

协程印象:

如何使用协程:

如何创建协程:

前置铺垫:扩展日志打印函数

协程基本创建方式:

使用runBlocking创建协程块

通过launch方式启动:看不到运行结果(Windows平台上)

*   参数分析:

    ```
     CoroutineScope.launch(
         //协程上下文:指定在哪个线程,使用什么Job    
         context: CoroutineContext = EmptyCoroutineContext,
         //协程的启动模式
         start: CoroutineStart = CoroutineStart.DEFAULT,
         //协程执行块,返回Unit
         block: suspend CoroutineScope.() -> Unit
     ): Job//返回任务(取消、执行)
    ```

*   逻辑分析:直接返回协程当没有阻塞的过程(launch来不及执行程序结束了,导致没有运行结果)
*   需要看到结果:阻塞一下主线程

    ```
     Thread.sleep(1000)//阻塞主线程一秒
    ```

第三种方式:GlobalScope.async

*   参数分析:

    ```
     CoroutineScope.async(
         context: CoroutineContext = EmptyCoroutineContext,
         start: CoroutineStart = CoroutineStart.DEFAULT,
         block: suspend CoroutineScope.() -> T
     ): Deferred<T>
     返回参数: Deferred  Deferred<out T> : Job
    ```

*   继承关系(类似launch):DeferredCorotinue--->AbstractCorotinue

测试协程的返回值

*   关于阻塞:runBlocking会阻塞UI主线程而另外两种则不会;且发现协程到底运行在那一个线程上,是不确定了;进一步明确了(进/线程属于OS级别而协程则是语言特性)

创建协程总结:启动协程 协程作用域范围

*   阻塞调用者线程并兴起新附着,异步执行

*   该方法的设计目的是让suspend风格编写的库能够在常规阻塞代码中使用,常在main方法和测试中使用。

协程的其余创建方式:

    **并实现了协程上下文**
*   CoroutineScope是一个接口且只有一个属性(**意味着只要继承自CoroutineScope并实现接口属性就可以创造一个协程作用域了**)
*   方式二:实现接口

    *   代码:当没有指定协程附着的线程时,协程到底运行在那一个线程上是不确定的

        ```
         //方式2
         class MyCoroutineScope : CoroutineScope{
             override val coroutineContext: CoroutineContext
                 get() = EmptyCoroutineContext
         
         }
         val myCustomScope = MyCoroutineScope()
         myCustomScope.launch {
             log("myCustomScope launch")
         }
         myCustomScope.async {
             log("myCustomScope async")
         }
        ```

作者:WAsbry
链接:https://juejin.cn/post/7107261954191785992

上一篇下一篇

猜你喜欢

热点阅读