- 什么是协程:
Kotin协程:协程通过将复杂性放入库来衙化异步编程,程序的逻辑可以在协程中顺序地表达,而底层库会为找们解决其异步性,该库可以将用户代码的相关部分包装为回调、订阅相关事件:在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。是一个轻量级的线程,是Google从语言方面对线程的做一个封装优化,诞生的。与jetpack、kotlin、acc、scope、vvm这些搭配易用,一套的工具体系所以兼容性更好。
协程(Coroutine)就是协同程序,而Kotlin协程就是一个基于Java Thread API封装的工具包,帮助我们轻松的写出复杂的并发代码。
kotlin协程相较于线程池,并没有什么,能上的优势。
非阻塞式挂起没什么特别的, java子线程也同样是非阻塞式的
特点:轻量;实质,便于多线程开发;线程池;网络库支持,轻便优雅。 - 需要导入的库:
- GlobalScope.launch
可创建一个协程作用域。异步,不阻塞线程,返回值Job,是一个能控制协程的接口,能取消,加入。代码:
运行结果:
这里我们可以看出:最先打印的是“你好吗?”,说明虽然前面还有两个GlobalScope.launch函数代码块都有sleep(1000),但是并没有等待它们运行结束后再往后面执行;因为launch是一个非阻塞性线程,所以在最后还有个sleep(2200),不然就运行结束了。 - GlobalScope.async
异步,不阻塞线程 。返回值是 Deferred,可以得到运行的结果并返回。在调用await()方法时,如果代码块中的代码没有执行完毕,那么该方法会一直阻塞当前协程,直到获取async函数的执行结果。其他和 launch 是一样的。 - RunBlocking
阻塞线程。通常用于普通函数与协程的桥接。会场造一个有生命周期的一个阻塞式的协程,会等待内部协程执行完毕才会结束。但是它会产生一些性能上的问题。代码:运行结果:
它是顺序执行的代码结果,所以它是阻塞线程的。 - Cancel、Join
用于launch返回的Job来控制该协程,加入或者取消。代码:
L1、L2、a1只是打印一个结果,a2里面是循环打印20次。
第一次没有使用Cancel、Join的结果:
因为 launch和async是不阻塞线程的,所以先打印最后一个不在任何线程里面的代码:外部和耗时,因为RunBlocking是等待内部协程执行完毕后才会结束运行,所以会不分先后的执行完L1、L2、a1、a2的全部代码。
第二次执行加入 a2.join() 的结果:
在这里可以看出加入a2.join() 后,代码是要执行完a2后才继续往下执行,然后打印最后面的:外部和耗时,再接着打印a1的”你好“。
第三次执行加入 a2.cancer() 没有 a2.join() 的结果:
可以看出a2的代码没有完全执行完,因为a2在第一次执行到delay(200)的时候,在a1里面执行了a2.cancer() - await,async的异步deferred结果获取
前面知道async是有一个返回值的运行结果:
需要注意的是在async代码块里面最后有个返回值;最后的打印代码里面a.await是可以获取async代码块的返回值,并且要两个都运行结束才会打印。
await是一个挂起函数,不会阻塞等待一个最终结果。
suspend: 可以挂起函数,但是它不能提供一个协程的作用域。挂起函数只能在另外的挂起函数或者是协程里面调用, - coroutineScope:也是一个挂起函数,可以在任何挂起函数中调用,而且还宽裕继承外部的协程作用域并创建一个子作用域。它就可以与suspend搭配使用。它和RunBlocking很类似,也会等待内部协程执行完毕才会结束,不然会一直阻塞当前协程,当然不会影响其他协程和线程,所有对性能也没有影响。
delay():是一个非阻塞式的挂起函数,只会挂起当前协程,并不会影响其他协程运行。而Therad.sleep():会阻塞当前的线程,这样运行在该线程下的所有协程都会被阻塞。
WithContext():会立即执行代码块的代码,同时将当前协程阻塞住,在代码执行完毕后,会将最后一行代码的执行结果作为返回值返回,但是它要求我们制定一个线程参数,Dispatcher.Default、Dispatcher.IO、Dispatcher.Main(字太多了,不想打了)
kotlin协程笔记
最新推荐文章于 2024-04-10 18:56:11 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)