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这种是不对的,需要适应新的写法。
Kotlin协程第一个示例剖析及Kotlin线程使用技巧的更多相关文章
- Kotlin协程解析系列(上):协程调度与挂起
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
- Kotlin协程基础
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...
- Kotlin 协程一 —— 全面了解 Kotlin 协程
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
- Kotlin协程作用域与构建器详解
在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...
- Android Kotlin协程入门
Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...
- Kotlin协程重要概念详解【纯理论】
在之前对Kotlin的反射进行了详细的学习,接下来进入一个全新的篇章,就是关于Koltin的协程[coroutine],在正式撸码之前先对它有一个全面理论化的了解: 协程的定义: 协和通过将复杂性放入 ...
- Retrofit使用Kotlin协程发送请求
Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用.本文简单介绍一下Retrofit中协程的使用 导入依赖 app的build文件中加入: impleme ...
- rxjava回调地狱-kotlin协程来帮忙
本文探讨的是在tomcat服务端接口编程中, 异步servlet场景下( 参考我另外一个文章),用rxjava来改造接口为全流程异步方式 好处不用说 tomcat的worker线程利用率大幅提高,接口 ...
- Kotlin协程入门
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 介绍Kotlin中的协程.用一 ...
随机推荐
- mysql:获取某个表的所有字段
select COLUMN_NAME from information_schema.COLUMNS where table_name = '表名' and table_schema = '数据库名' ...
- 浅谈 Docker 安全合规建设
通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...
- AngularJS 常见面试问题
ng-if 跟 ng-show/hide 的区别有哪些? 第一点区别是,ng-if 在后面表达式为 true 的时候才创建这个 dom 节点,ng-show 是初始时就创建了,用 display:bl ...
- ACM算法锦集
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...
- 几个c++界面库的比较
有些人说QT比MFC简单,QT封装得太好了,给初学者错觉,QT很简单.QT实现的功能比MFC更多(多到有些时候你觉得QT真TM啰唆,但是有时又体会到他啰唆得很强大很有柔性),显然比MFC代码更多,运行 ...
- TCP Socket 套接字 和 粘包问题
一.Scoket 套接字 Scoket是应用层(应用程序)与TCP/IP协议通信的中间软件抽象层,它是一组接口.也可以理解为总共就三层:应用层,scoket抽象层,复杂的TCP/IP协议 基于TCP协 ...
- Label&Button
Button中的bg参数设置按钮背景颜色,fg参数设置字体颜色 pack中的fill参数告诉Packer让QUIT按钮占据剩余的水平空间,而expand参数则引导它填充整个水平可视空间,将按钮拉伸到左 ...
- GoLang 的变量
变量 1.为什么要变量 1.1.一个程序就是一个世界 1.2.变量是程序的基本组成单位 2.变量的介绍 2.1.变量的概念 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号, ...
- PostgreSQL学习笔记(二)—— 概览
数据库 创建数据库: createdb dbname 指定用户名创建数据库: createdb -U username dbname 删除数据库: dropdb dbname 访问数据库: psql ...
- python_dict json读写文件
命令汇总: json.dumps(obj) 将python数据转化为json Indent实现缩进,ensure_ascii 是否用ascii解析 json.loads(s) 将json数据转换为py ...