kotlin协程笔记

Kotlin协程是一种轻量级线程,简化了异步编程,保持代码顺序执行的简洁性。它通过GlobalScope.launch和GlobalScope.async进行非阻塞操作。RunBlocking用于阻塞线程,协程可以通过Job进行控制和取消。suspend函数和coroutineScope允许在协程中灵活挂起。延迟操作delay非阻塞,而Thread.sleep()会阻塞。WithContext()执行代码块并在完成后返回结果。
摘要由CSDN通过智能技术生成
  1. 什么是协程:
    Kotin协程:协程通过将复杂性放入库来衙化异步编程,程序的逻辑可以在协程中顺序地表达,而底层库会为找们解决其异步性,该库可以将用户代码的相关部分包装为回调、订阅相关事件:在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。是一个轻量级的线程,是Google从语言方面对线程的做一个封装优化,诞生的。与jetpack、kotlin、acc、scope、vvm这些搭配易用,一套的工具体系所以兼容性更好。
    协程(Coroutine)就是协同程序,而Kotlin协程就是一个基于Java Thread API封装的工具包,帮助我们轻松的写出复杂的并发代码。
    kotlin协程相较于线程池,并没有什么,能上的优势。
    非阻塞式挂起没什么特别的, java子线程也同样是非阻塞式的
    特点:轻量;实质,便于多线程开发;线程池;网络库支持,轻便优雅。
  2. 需要导入的库:在这里插入图片描述
  3. GlobalScope.launch
    可创建一个协程作用域。异步,不阻塞线程,返回值Job,是一个能控制协程的接口,能取消,加入。代码:launch函数测时
    运行结果:launch函数的运行结果
    这里我们可以看出:最先打印的是“你好吗?”,说明虽然前面还有两个GlobalScope.launch函数代码块都有sleep(1000),但是并没有等待它们运行结束后再往后面执行;因为launch是一个非阻塞性线程,所以在最后还有个sleep(2200),不然就运行结束了。
  4. GlobalScope.async
    异步,不阻塞线程 。返回值是 Deferred,可以得到运行的结果并返回。在调用await()方法时,如果代码块中的代码没有执行完毕,那么该方法会一直阻塞当前协程,直到获取async函数的执行结果。其他和 launch 是一样的。
  5. RunBlocking
    阻塞线程。通常用于普通函数与协程的桥接。会场造一个有生命周期的一个阻塞式的协程,会等待内部协程执行完毕才会结束。但是它会产生一些性能上的问题。代码:RunBlocking运行结果:在这里插入图片描述
    它是顺序执行的代码结果,所以它是阻塞线程的。
  6. 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()
  7. await,async的异步deferred结果获取
    前面知道async是有一个返回值的在这里插入图片描述运行结果:在这里插入图片描述
    需要注意的是在async代码块里面最后有个返回值;最后的打印代码里面a.await是可以获取async代码块的返回值,并且要两个都运行结束才会打印。
    await是一个挂起函数,不会阻塞等待一个最终结果。
    suspend: 可以挂起函数,但是它不能提供一个协程的作用域。挂起函数只能在另外的挂起函数或者是协程里面调用,
  8. coroutineScope:也是一个挂起函数,可以在任何挂起函数中调用,而且还宽裕继承外部的协程作用域并创建一个子作用域。它就可以与suspend搭配使用。它和RunBlocking很类似,也会等待内部协程执行完毕才会结束,不然会一直阻塞当前协程,当然不会影响其他协程和线程,所有对性能也没有影响。
    delay():是一个非阻塞式的挂起函数,只会挂起当前协程,并不会影响其他协程运行。而Therad.sleep():会阻塞当前的线程,这样运行在该线程下的所有协程都会被阻塞。
    WithContext():会立即执行代码块的代码,同时将当前协程阻塞住,在代码执行完毕后,会将最后一行代码的执行结果作为返回值返回,但是它要求我们制定一个线程参数,Dispatcher.Default、Dispatcher.IO、Dispatcher.Main(字太多了,不想打了)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值