zoukankan      html  css  js  c++  java
  • Kotlin协程第一个示例剖析及Kotlin线程使用技巧

    Kotlin协程第一个示例剖析:

    上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直观的感受一下协程,先用一个Hello World级别的示例来进行,这里新建一个工程:

    默认的gradle的配置如下:

    下面得修改一下,增加协程相关的依赖:

    此时编译完之后就会有如下依赖包:

    然后再建一个kotlin的源代码目录,目前只有一个java:

    好,接下来新建一个Kotlin的测试文件开始撸码:

    在我们之前编写的程序中都是用的带参数的main()方法,其实也可以不要参数,那咱们使用一下无参的main()方法:

    那协程怎么创建呢?先来回忆一下上一次的理论:

    但是CoroutineScope是一个接口,如下:

    所以这里得用它的实现类:

     

    而看一下GlobalScope这个类,就是它的实现类:

     

    下面来看一下运行效果:

    其中看一下协程中用到了一个delay(),看一下它的官方说明:

    根据这个解释,我们再来解释一下输出,在运行的时候会立马先打印出“hello”,这时因为协程的延迟是不会阻塞线程的:

     

    但是此时协程自己会休眠1秒,而接着主线程要休眠2秒:

    在这2秒过程中,休眠1秒的协程则会输出“Kotlin Coroutines”:

    最后过了2秒之后,主线程则继续执行,则“World”就打印了:

    那接下来如果将主线程的休眠时间由2秒改得比协程中的休眠更短呢?

    看结果:

    居然协程都木有输出,这是因为协程是依附于线程的,当线程都退出了,当然协程也不会执行了嘛,这点可以清楚的体会到协程的一个角色。

    Kotlin线程使用技巧:

    对于上面协程的效果其实可以用纯线程的方式来实现,这里来学习一下在Koltin中使用线程的一个标准姿势,跟Java还是有很大的区别的,如下:

    运行看一下:

    嗯,确实效果一样,但是它跟协程当然还是有区别的啦,毕境是用线程来模拟的,如果将主线程的休眠时间改短,则就不一样了,这里忽略,下面重点来理解Kotlin的这种创建线程的方式,先看一下这个thread是怎么定义的:

    其中返回的Thread是为Java的:

    那为啥我们在调用函数的时候直接跟了个花括号,而非圆括号?

    这就需要看一下该函数定义的参数声明了:

    这就是Kotlin的基本功的体现了,对于Kotlin的一个高阶函数而言,如果最后一个参数是Lambda表达式,则可以以花括号的形式来传给这个Lambda表达式,当然啦也可以用传统的方式来传递,比如:

    直接用句名的方式来显示指定要传的参数,但是!!!这种传统的写法不是Kotlin推崇的正统风格,所以需要适应这种写法,那还有个问题,为啥这样传递了之后我们的线程中的代码就能得到正常执行呢?

    此时就需要看一下它的官方说明了:

    而start默认值就是为true:

    所以这个问题的答案就可以知道了,好接下来继续来读读其它参数的含义:

    再来看一下此方法的具体实现,就知道为啥这个方法有这样创建线程的功效了:

    其中对象表达式在之前已经学习过了,可以参考:https://www.cnblogs.com/webor2006/p/11352421.html

    下面来做个实验,我们手动的来将start参数置为false,看下是否线程中的代码块就不会被执行了:

    确实如此,当然啦这时我们也可以以Java的思路将其手动启动既可,如下:

    但是!!!这不是一个正常使用Kotlin的姿势,如果用Java的思维来使用Kotlin这种是不对的,需要适应新的写法。

  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/webor2006/p/11714647.html
Copyright © 2011-2022 走看看