快速入门Kotlin⑤协程

基础

本质上,协程是轻量级的线程。

runBlocking 用于在当前线程中阻塞执行协程代码直到协程执行完毕。它通常用于在主函数或测试代码中使用,以确保协程代码的顺序执行。

GlobalScope.launch 是一个顶级函数,用于在全局范围内启动一个新的协程。它创建一个顶级协程,该协程的生命周期与应用程序的生命周期相同。

delay 是协程库中的一个挂起函数,用于延迟指定的时间。它会不会阻塞整个线程,只会暂停当前协程的执行,并在指定的时间过后恢复执行。

桥接阻塞与非阻塞的世界

fun main() {GlobalScope.launch { // 在后台启动一个新的协程并继续delay(1000L) // 非阻塞的等待 1 秒钟(默认时间单位是毫秒)println("World!") // 在延迟后打印输出}println("Hello,") // 协程已在等待时主线程还在继续runBlocking {     // 但是这个表达式阻塞了主线程delay(2000L)  // ……我们延迟 2 秒来保证 JVM 的存活}
}
//输出:
//Hello,
//World!

等待一个作业

问题:显式阻塞比较Hack;

解决方案:使用join()去实现非阻塞方式等待所启动的后台 Job 执行结束。

//显式(以非阻塞方式)等待所启动的后台 Job 执行结束:
fun main() = runBlocking {val job = GlobalScope.launch { // 启动一个新协程并保持对这个作业的引用delay(1000L)println("World!")}println("Hello,")job.join() // 等待直到子协程执行结束
}//输出:
//Hello,
//World!

结构化并发

问题:GlobalScope.launch 会创建一个顶层协程。虽然它很轻量,但它运行时仍会消耗一些内存资源。可能会造成:内存不足、延迟太久等各种问题。

解决方案:在执行操作所在的指定作用域内启动协程, 而不是像通常使用线程(线程总是全局的)那样在 GlobalScope 中启动。

//显式(以非阻塞方式)等待所启动的后台 Job 执行结束。
//在这个作用域中启动协程而无需显式 join 之,因为外部协程(示例中的 runBlocking)直到在其作用域中启动的所有协程都执行完毕后才会结束。
fun main() = runBlocking {// this: CoroutineScopelaunch { // 在 runBlocking 作用域中启动一个新协程delay(1000L)println("World!")}println("Hello,")
}

coroutineScope 和 runBlocking 都会阻塞当前线程,但它们之间的主要区别是:runBlocking 方法会阻塞当前线程来等待, 而 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVASE】带你了解面向对象三大特性之一(多态)

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.多态 1.1 多态的概念 多态的概念:通俗来说&#…

如何在Linux中查找和删除软链接

在Linux中,软链接(或符号链接)相当于Windows中的快捷方式。它们是指向文件或目录的引用。有时候,我们需要替换或删除这些软链接,特别是在更新软件或解决路径冲突时。本文将教你如何查找和删除Linux中的软链接。 查找软…

达梦导出工具dexp

基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例dexp 逻辑导出 dexp 工具可以对本地或者远程数据库进行数据库级、用户级、模式级和表级的逻辑备份。备份的内容非…

MySql数据库从0到1学习-第一天DDL学习

DDL 数据库(查询/创建/修改/删除) 查询数据库 以下语句的database 可以替换为schema,效果一样 //展示所有的数据库 show database; //显示当前选择的数据库 select database(); 创建数据库 //创建一个数据库叫db_name create database db_name;//如果不存在就创建db_name cr…

鸿蒙学习记录

问题小测记录 总结链接:小测总结 学习笔记:鸿蒙开发学习记录 1、 main_pages.json存放页面page路径配置信息。 2、在stage模型中,下列配置文件属于AppScope文件夹的是? app.json5 3、module.json5配置文件中,包含…

RabbitMQ知识点

什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 为什么要使用 rabbitmq 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能拥有持久化的机制,进程消息,队列中…

Java集合基础知识点复习

目录 Java提供的常见集合ListArrayList底层实现与扩容机制ArrayList listnew ArrayList(10)中的list扩容几次如何实现数组和List之间的转换用Arrays.asList转List后,如果修改了数组内容,list受影响吗?List用toArray转数组后,如果修…

Vue 【vite使用alias】

文章目录 前言一、vite.config.ts二、tsconfig.json三、可能遇到的问题 前言 这是一个比较常用,且配置简单的功能。但是在不同环境下还是有点点小坑,这边就当是一个全面的记录吧。 vite中配置alias总共需要配置两个地方 vite.config.ts:让代…

Java基础知识总结(44)

(1)分支结构——Switchcase 语法: switch(expression){ case 1: //代码 break; case 2: //代码 break; ... default: } Java7之前 expression的类型只支持byte、short、int、charJava7之后添加了String和枚举switch分支语句的执行是先对expre…

【STL】链表(list)

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个…

uniapp项目问题及解决(前后端互联)

1.路由跳转的问题 uni.navigateTo() 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面 uni.redirectTo() 关闭当前页面,跳转到应用内的某个页面。 uni.reLaunch&…

MySQL-复杂SQL语句编写:子查询分析与练习

子查询 1. 由一个具体的需求&#xff0c;引入子查询2. 称谓的规范&#xff1a;外查询&#xff08;或主查询&#xff09;、内查询&#xff08;或子查询&#xff09;3. 子查询的分类4. 单行子查询4.1 单行操作符&#xff1a; ! > > < <4.2 子查询中的空值问题4.3 非…

揭开Spring Bean生命周期的神秘面纱

目录 一、Spring IOC 1.1 Spring IOC 的加载过程 二、Spring Bean 生命周期 2.1 实例化前置 2.2 实例化后置 2.3 属性赋值 2.4 初始化前置 2.5 初始化 2.6 初始化后置 2.7 Bean 销毁 Spring 是一个开源的企业级Java应用程序框架&#xff0c;它简化了企业级应用程序开…

开源数据湖iceberg, hudi ,delta lake, paimon对比分析

Iceberg, Hudi, Delta Lake和Paimon都是用于大数据湖(Data Lake)或数据仓库(Data Warehouse)中数据管理和处理的工具或框架,但它们在设计、功能和适用场景上有所不同。 Iceberg: Iceberg是用于大型分析表的高性能格式。Iceberg将SQL表的可靠性和简易性带入到大数据领域,同…

【java的本地锁到分布式锁介绍】

文章目录 1.java本地自带锁介绍及应用synchronized&#xff08;1&#xff09;synchronized原理和优化&#xff08;2&#xff09;synchronized作用&#xff08;3&#xff09;synchronized的使用 CAS(1) CAS原理&#xff08;2&#xff09;CAS和synchronized优缺点 lock 2.分布式锁…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;先二分查找行&#xff0c;再二分查找列。解题思路二&#xff1a;暴力遍历&#xff0c;也能过。解题思路三&#xff1a;用python的in。 题目描述&#xff1a; 给你一个满足下述两条…

VSCODE目录树缩进调整

VSCode默认的缩进太小了&#xff0c;简直看不出来&#xff0c;很容易弄混目录。在设置里修改就行了。 修改后效果&#xff1a;

何为网络协议?一图知晓网络过程。

网络协议就是计算机之间沟通的语言 为了有效地交流&#xff0c;计算机之间需要一种共同的规则或协议&#xff0c; 就像我们和老外沟通之前&#xff0c;要先商量好用哪种语言&#xff0c; 要么大家都说中文&#xff0c;要么大家都说英语&#xff0c;这才能有效地沟通。 网络协…

04-springmvc-RequestContextHolder

一、获取request对象的四种方法 方法1、Controller中加参数来获取request 注意&#xff1a;只能在Controller中加入request参数。 一般&#xff0c;我们在Controller中加参数获取HttpServletRequest&#xff0c;如下所示&#xff1a; RestController RequestMapping("…