协程:可以简单地将它理解成一种轻量级的线程
协程允许我们在单线程模式下模拟多线程编程的效果,
代码执行时的挂起与恢复完全是由编程语言来控制的,和操作系统无关。
这种特性使得高并发程序的运行效率得到了极大的提升。
协程让异步线程同步化,杜绝回调地狱。
协程最核心的点就是,函数或者一段程序能够被挂起,稍后再在挂起的位置恢复。
1、处理耗时任务:这种任务常常会阻塞主线程
2、保证主线程安全:即确保安全地从主线程调用任何suspend函数
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"
1、runBlocking:阻塞主线程
runBlocking {
}
2、GlobalScope.launch:顶级协程,不阻塞主线程
GlobalScope.launch {
}
3、在协程中使用 launch 新建多个子协程(同一线程池),launch 和 launch之间是并发执行,
只有在 CoroutineScope 作用域下才可以使用 launch。
GlobalScope.launch {
launch {
}
launch {
}
launch {
}
}
runBlocking {
launch {
}
launch {
}
launch {
}
}
CoroutineScope(Dispatchers.Default).launch {
}
Kotlin的协程实现分为两个层次:
* 基础设施层,标准库的协程API,主要对协程提供了概念和语义上的最基本的支持
* 业务框架层,协程的上层框架支持
我们可以使用基础设施层创建协程:
val continuation = suspend { // 协程体
5
}.createCoroutine(object : Continuation<Int> {
override val context: CoroutineContext = EmptyCoroutineContext
override fun resumeWith(result: Result<Int>) {
println(result)
}
})
continuation.resume(Unit)
我们知道了其实创建协程的过程,在基础设施层中也是看起来那么复杂。
常规函数基本操作包括:invoke(或call)和return,协程新增了suspend和resume:
* suspend:也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量;
* resume:用于让已暂停的协程从其暂停处继续执行。
使用suspend关键字修饰的函数叫作挂起函数。
挂起函数只能在协程体内或其他挂起函数内调用。
Dispatchers.Default:表示会使用一种默认低并发的线程策略,当你要执行的代码属于计算密集型任务时,
开启过高的并发反而可能会影响任务的运行效率,此时就可以使用Dispatchers.Default。
场景:数组排序,JSON数据解析,处理差异判断。
Dispatchers.IO:表示会使用一种较高并发的线程策略,当你要执行的代码大多数时间是在阻塞和等待中,
比如说执行网络请求时,为了能够支持更高的并发数量,此时就可以使用Dispatchers.IO。
场景:数据库、文件读写、网络处理
Dispatchers.Main:则表示不会开启子线程,而是在Android 主线程中执行代码,
但是这个值只能在Android 项目中使用。
场景:调用suspend函数、调用UI函数、更新LiveData
GlobalScope.launch(Dispatchers.Main) { // 主线程
// delay是一个非阻塞式的函数,让协程挂起,不影响其它协程运行
// 让协程挂起15秒
delay(15000) // 假设有15s的耗时操作
}
以上协程已经切换到了Main线程调度器,
delay 是挂起函数,可以让delay函数暂时挂起,挂起函数不会阻塞线程(主线程或其它线程),
另外,协程体本身就是一个挂起函数。
如果不使用协程,在主线程中,存在15秒耗时操作,会引起ANR。
比如:Thread.sleep(15000)
Thread.sleep函数是真正的阻塞函数,它会让当前线程阻塞。
耗时处理一般在异步线程来处理,异步线程不仅创建了多余的内存,而且异步线程执行完之后,需要切换线程之后才能更新UI,
如果不使用协程,使用存java的方式切换线程,代码量较多,后期维护成本较大。
使用协程,可以简化代码,而且优化了并发速度。
我们知道,协程体中代码是暂时被挂起的,不会引起阻塞,但是为了更好的并发,我们将耗时操作放到Dispatchers.Default或者Dispatchers.IO调度器上处理,优化有的协程代码如下:
GlobalScope.launch(Dispatchers.Main) { // 主线程
withContext(Dispatchers.Default) { // 耗时操作在IO中执行
// delay是一个非阻塞式的函数,让协程挂起,不影响其它协程运行
// 让协程挂起15秒
delay(15000) // 假设有15s的耗时操作
}
// 更新UI
//。。。执行更新UI操作。。。
}
当某个协程任务丢失,会导致内存、CPU、磁盘等资源浪费,甚至发送一个无用的网络请求,这种情况称为任务泄露。
为了能够避免协程泄露,Kotlin引入了结构化并发机制。
使用结构化并发可以做到:
CoroutinesScope:定义协程必须指定其CoroutinesScope,它会跟踪所有协程,同样它还可以取消由它所启动的所有协程。
常用的相关API有:
GlobalScope,生命周期是process级别的,即使Activity或Fragment已经被销毁,协程仍然在执行。
GlobalScope.launch { }
MainScope,在Activity中使用,可以在onDestory中取消协程。
private val mainScope = MainScope()
mainScope.launch { // 创建协程
}
// 在onDestroy中取消协程,防止协程泄露
override fun onDestroy() {
super.onDestroy()
mainScope.cancel()
}
一般使用委托的方式取处理:
定义一个基类:
abstract class ScopedActivity: AppCompatActivity(), CoroutineScope by MainScope(){
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
这样就可以方便的在Activity中使用协程了,而且还不用担心协程泄露,
在Activity中使用时,直接launch就可以了:
launch {
}
viewModelScope,只能在ViewModel中使用,绑定ViewModel的生命周期。
继承 ViewModel 或 AndroidViewModel
依赖:
implementation"androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
viewModelScope.launch { // 创建协程
}
lifecycleScope,只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期。
依赖:
implementation"androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
lifecycleScope.launch {
}
和生命周期绑定,会自动取消。
[本章完...]
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
点击->操作系统复习的文章集目录操作系统线程线程是什么进程与线程的关系用户态/内核态操作系统资源管理内核态用户态内核态/用户态切换程序运行类型分析计算密集型IO密集型结合进程,线程来理解程序运行类型分析协程基础上下文切换协程协程为什么叫协作式线程?协程的优缺点操作系统线程典型问题:简述进程和线程的区别以下内容带您一步步了解线程是什么比进程更小的独立运行的基本单位-线程(Threads)线程的提出主要是为了提高系统内程序并发执行的程度,从而进一步提升系统的吞吐量,充分发挥多核CPU的优越性而设计的引入进程是为了操作系统更加方便地管理程序,使得多个程序能并发管理和执行而线程则是为了减少程序在并发执
目录1关系运算符2运算符优先级3关系表达式的书写代码实例:下面是面试中可能遇到的问题:1关系运算符C++中有6个关系运算符,用于比较两个值的大小关系,它们分别是:运算符描述==等于!=不等于小于>大于小于等于>=大于等于这些运算符返回一个布尔值,即true或false。例如,当x等于y时,x==y的结果为true,否则结果为false。2运算符优先级在C++中,关系运算符的优先级高于赋值运算符,但低于算术运算符。以下是关系运算符的优先级,从高到低排列:运算符描述>,,>=,关系运算符==,!=相等性运算符&&逻辑与`如果在表达式中有多个运算符,则按照优先级顺序依次进行运算。3关系表达式的书写在
一.计算机组成原理 这本书利用组合逻辑、同步时序逻辑电路设计的相关知识,从逻辑门开始逐步构建运算器、存储器、数据通路和控制器,最终集成为完整的CU原型系统,使读者从设计者的角度理解计算机部件构成及运行的基本原理,掌握软硬件协同的概念。 全书共9章,主要内容包括计算机系统概述、数据信息的表示、运算方法与运算器、存储系统、指令系统、中央处理器、指令流水线、总线系统、输入输出系统。1.计算机系统概述1.1计算机发展历程 计算机是一种能够按照事先存储的程序,自动、高速、准确地对相关信息进行处理的电子设备。1946年2月,世界上第一台电子数字计算机ENIAC(ElectronicNum
其实现在基础的资料和视频到处都是,就是看你有没有认真的去找学习资源了,去哪里学习都是要看你个人靠谱不靠谱,再好的教程和老师,你自己学习不进去也是白搭在正式选择之前,大可以在各种学习网站里面找找学习资源先自己学习一下为什么选择学软件测试?同学们理由众多!大概分这几类:①不受开发语言、行业产品变化限制;②入门更简单,对零基础、女生都友好;③软件项目都需要测试人员,职业生涯稳;④学习周期短,但薪资并不低。要想“肩扛”一条线?需掌握三大技能:技能1:掌握测试流程,熟悉系统框架能提前与开发人员一起制定测试计划,通过测试左移,推动代码评审,代码审计,单元测试,自动化冒烟测试,来保证研发阶段的质量。技能2:
Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。已关闭8年。什么是学习ruby语言