Kotlin协程第一个示例剖析:html
上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,此次则用代码来直观的感觉一下协程,先用一个Hello World级别的示例来进行,这里新建一个工程:java
默认的gradle的配置以下:web
下面得修改一下,增长协程相关的依赖:函数
此时编译完以后就会有以下依赖包:学习
而后再建一个kotlin的源代码目录,目前只有一个java:测试
好,接下来新建一个Kotlin的测试文件开始撸码:gradle
在咱们以前编写的程序中都是用的带参数的main()方法,其实也能够不要参数,那我们使用一下无参的main()方法:url
那协程怎么建立呢?先来回忆一下上一次的理论:spa
可是CoroutineScope是一个接口,以下:.net
因此这里得用它的实现类:
而看一下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这种是不对的,须要适应新的写法。