想自己做网站做推广国家职业技能培训学校
web/
2025/9/28 12:26:20/
文章来源:
想自己做网站做推广,国家职业技能培训学校,农业推广硕士,平面设计网上培训一般多少钱Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景
在项目实践过程中#xff0c;笔者发现很多异步或者耗时的操作#xff0c;都使用了Kotlin中的协程#xff0c;所以特地研究了一番。
定义
关于协程#xff08;Coroutine#xff09;#xff0c;其实… Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景
在项目实践过程中笔者发现很多异步或者耗时的操作都使用了Kotlin中的协程所以特地研究了一番。
定义
关于协程Coroutine其实更多的应该是一种并发设计模式。与传统的线程或进程相比协程更加轻量级因为它运行在线程之上在执行过程中可以主动地暂停并在需要时恢复执行。而且这些切换操作是在操作系统中的用户态完成的。
实践
引入maven依赖
dependencygroupIdorg.jetbrains.kotlinx/groupIdartifactIdkotlinx-coroutines-core/artifactId
/dependency两种启动模式 runBlockingGlobalScope.launch
GlobalScope.launch
在 GlobalScope.launch 中启动的协程不会阻塞主线程。主线程会继续执行而协程会在后台执行。在上述例子中为了演示效果使用了 Thread.sleep(2000) 来模拟等待协程执行。 其中launch 是一个函数用于创建协程并将其函数主体的执行分派给相应的调度程序。
fun main() {// 启动协程GlobalScope.launch {delay(2000) // 挂起协程模拟异步操作println(World!)}println(Hello,)Thread.sleep(4000) // 阻塞主线程等待协程执行完毕
}runBlocking
在 runBlocking 中启动的协程会阻塞当前线程直到所有启动的协程都执行完毕。
fun main() runBlocking {// 在 runBlocking 作用域内启动协程launch {// 协程代码println(Inside coroutine)}// 主线程继续执行println(Outside coroutine)// 阻塞主线程等待协程执行完毕
}业务实践
Dispatchers.IO Kotlin提供的协程调度方式指示此协程应在为 I/O 操作预留的线程上执行适合在主线程之外执行磁盘或网络 I/O。Dispatchers.Main 使用此调度程序可在主线程上运行协程。在官方文档介绍中主要用于安卓开发中与界面交互和执行快速工作。Dispatchers.Default 适合在主线程之外执行占用大量 CPU 资源的工作。
private fun sendRefundHttpPost(weChatPayRefundUrl: String, xmlRequestData: String): MapString, String runBlocking {// 启用协程发送退款操作returnrunBlocking withContext(Dispatchers.IO) {val responseXmlStr careWeChatHttps.postXmlForString(weChatPayRefundUrl, xmlRequestData)WXPayUtil.xmlToMap(responseXmlStr)}}private fun getSchoolDate(allTeacherIds: SetString): WildSchoolData runBlocking {// 涉及统计的allTeacherIds 数量比较大, 创建异步任务去操作val elements allTeacherIds.chunked(60).map {async(Dispatchers.Default) {val totalCount teacherPerformanceServiceApi.getTeachersTotalPerformanceCount(it).performanceCountval currentWeekCount teacherPerformanceServiceApi.getTeachersCurrentWeekPerformanceCountByByRangeTime(it).performanceCountWildSchoolData(totalCount, currentWeekCount)}}// 调用await等待异步任务结束returnrunBlocking WildSchoolData(elements.awaitAll().sumBy { it.totalCount }, elements.awaitAll().sumBy { it.currentWeekCount })}fun savePoint(pagePointVo: PagePointVo): Any {// 启用协程执行一个操作流水的插入, 不影响其他操作GlobalScope.launch(context Dispatchers.IO) {val pagePoint PagePoint().apply {this.schoolId pagePointVo.schoolIdthis.userId pagePointVo.userIdthis.userRole pagePointVo.userRolethis.moduleKey pagePointVo.moduleKeythis.eventId pagePointVo.eventIdthis.clickTime Date()}pagePointMapper.insert(pagePoint)}// 其他操作}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83329.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!