Kotlin语言基础入门到熟悉:Kotlin协程基础

Kotlin协程详解——协程基础 你通常会看到 runBlocking 在应用程序的最顶层被这样使用,而在真正的代码中却很少见到它的身影,因为线程是宝贵的资源,阻塞它们是低效的,而且通常是不被期望的。协程遵循结构化并发的原则,这意味着新的协程只能在特定的 CoroutineScope 内启动,该作用域限定了协程的生命周期。这些情况导致的问题是代码间的嵌套层级太深,导致逻辑嵌套复杂,后续的维护成本也要提高,这不是我们所要看到的。协程可以被视为轻量级的线程,但它们之间存在一些重要的区别,这使得它们在实际使用中与线程有很大的不同。 阅读详情

在这里插入图片描述

Kotlin语言基础入门到熟悉:Kotlin协程基础

1. 阻塞与非阻塞

runBlocking

delay是非阻塞的,Thread.sleep是阻塞的。显式使用 runBlocking 协程构建器来阻塞。

import kotlinx.coroutines.\*



fun main() {

 GlobalScope.launch { // 在后台启动一个新的协程并继续

 delay(200)

 "rustfisher.com".forEach {

 print(it)

 delay(280)

 }

 }

 println("主线程中的代码会立即执行")

 runBlocking {     // 这个表达式阻塞了主线程

 delay(3000L)  //阻塞主线程防止过快退出

 }

 println("\n示例结束")

}

可以看到,runBlocking里使用了delay来延迟。用了runBlocking的主线程会一直阻塞直到runBlocking内部的协程执行完毕。 也就是runBlocking{ delay }实现了阻塞的效果。

我们也可以用runBlocking来包装主函数。

import kotlinx.coroutines.\*



fun main() = runBlocking {

 delay(100) // 在这里可以用delay了



 GlobalScope.launch {

 delay(100)

 println("Fisher")

 }

 print("Rust ")

 delay(3000)

}

runBlocking<Unit>中的<Unit>目前可以省略。

runBlocking也可用在测试中

// 引入junit

dependencies {

 implementation("junit:junit:4.13.1")

}

单元测试

使用@Test设置测试

import org.junit.Test

import kotlinx.coroutines.\*



class C3Test {



 @Test

 fun test1() = runBlocking {

 println("junit测试开始 ${System.currentTimeMillis()}")

 delay(1234)

 println("junit测试结束 ${System.currentTimeMillis()}")

 }

}

运行结果

junit测试开始 1632401800686

junit测试结束 1632401801928

IDEA可能会提示no tasks available。需要把测试选项改为IDEA,如下图。

更改设置

img

2. 等待

有时候需要等待协程执行完毕。可以用join()方法。这个方法会暂停当前的协程,直到执行完毕。需要用main() = runBlocking。

import kotlinx.coroutines.\*



fun main() = runBlocking {

 println("测试等待")

 val job1 = GlobalScope.launch {

 println("job1 start")

 delay(300)

 println("job1 done")

 }

 val job2 = GlobalScope.launch {

 println("job2 start")

 delay(800)

 println("job2 done")

 }



 job2.join()

 job1.join() // 等待

 println("测试结束")

}

运行log

测试等待

job1 start

job2 start

job1 done

job2 done

测试结束
3. 结构化的并发

用GlobalScope.launch时,会创建一个顶层协程。它不使用主线程。新创的协程虽然轻量,但仍会消耗一些内存资源。如果忘记保持对新启动的协程的引用,它还会继续运行。

我们可以在代码中使用结构化并发。

示例中,我们使用runBlocking协程构建器将main函数转换为协程。在里面(作用域)启动的协程不需显式使用join。

观察下面的例子:

import kotlinx.coroutines.\*



fun main() = runBlocking<Unit> {

 println("主线程id ${Thread.currentThread().id}")

 launch { // 在 runBlocking 作用域中启动一个新协程1

 println("协程1所在线程id ${Thread.currentThread().id}")

 delay(300)

 println("协程1执行完毕")

 }

 launch { // 在 runBlocking 作用域中启动一个新协程2

 println("协程2所在线程id ${Thread.currentThread().id}")

 delay(500)

 println("协程2执行完毕")

 }

 println("主线程执行完毕")

}

运行log

主线程id 1

主线程执行完毕

协程1所在线程id 1

协程2所在线程id 1

协程1执行完毕

协程2执行完毕

可以看到,不用像之前那样调用Thread.sleep或者delay让主线程等待一段时间,防止虚拟机退出。

程序会等待它所有的协程执行完毕,然后真正退出。

4. 作用域构建器

使用 coroutineScope 构建器声明自己的作用域。它会创建一个协程作用域,并且会等待所有已启动子协程执行完毕。

runBlocking 与 coroutineScope 看起来类似,因为它们都会等待其协程体以及所有子协程结束。主要区别在于:

* runBlocking 方法会阻塞当前线程来等待,是常规函数

* coroutineScope 只是挂起,会释放底层线程用于其他用途,是挂起函数

下面这个示例展示了作用域构建器的特点。main是一个作用域。

import kotlinx.coroutines.\*



fun main() = runBlocking { // this: CoroutineScope

 launch {

 delay(200L)

 println("协程1 t${Thread.currentThread().id}")

 }



 coroutineScope { // 创建一个协程作用域

 launch {

 delay(500L)

 println("内部协程2-1 t${Thread.currentThread().id}")

 }



 delay(100L)

 println("协程2 t${Thread.currentThread().id}")

 }



 println("主任务完毕")

}

运行log

协程2 t1

协程1 t1

内部协程2-1t1

主任务完毕
5. 提取函数重构

将launch { …… }内部的代码块提取到独立的函数中。提取出来的函数需要 suspend 修饰符,它是挂起函数。

import kotlinx.coroutines.delay

import kotlinx.coroutines.launch

import kotlinx.coroutines.runBlocking



fun main() = runBlocking<Unit> {

 launch { r1() }

 println("DONE")

}



// 挂起函数

suspend fun r1() {

 delay(300)

 println("提取出来的函数")

}

log

DONE

提取出来的函数
6. 协程是轻量的

我们前面也试过,创建非常多的协程,程序运行OK。

下面的代码可以输出很多的点

import kotlinx.coroutines.\*



fun main() = runBlocking {

 for (t in 1..10000) {

 launch {

 delay(t \* 500L)

 print(".")

 }

 }

}
7. 全局协程像守护线程

如果进程中只剩下了守护线程,那么虚拟机会退出。 前文那个的例子,其实也能看到,字符没打印完程序就结束了。

在 GlobalScope 中启动的活动协程并不会使进程保活。它们就像守护线程。

再举一个例子

import kotlinx.coroutines.\*



fun main() = runBlocking {

 GlobalScope.launch {

 for (i in 1..1000000) {

 delay(200)

 println("协程执行: $i")

 }

 }



 delay(1000)

 println("Bye~")

}

log

协程执行: 1

协程执行: 2

协程执行: 3

协程执行: 4

Bye~

最后分享一份

【腾讯技术团队出品】Android零基础入门到精通,Android Studio安装教程+全套安卓基础教程

Android编程入门教程

Java语言基础从入门到熟悉

在这里插入图片描述

Kotlin语言基础从入门到熟悉

在这里插入图片描述

Android 技术栈从入门到熟悉

在这里插入图片描述

Android Jetpack 全家桶全面学习

在这里插入图片描述

对于新手来说可能安装Android Studio存在一定困难你可以看着以下视频,一步步的跟着学习安装运行

Android Studio 安装教程

在这里插入图片描述

有了Java阶段的学习,这一阶段建议以视频学习为主辅以图书查漏补缺。如果以图书为主,可以根据图书讲解敲代码,辅以教学视频查漏补缺。遇到问题可以去百度,入门的问题一般会有很多人遇到,并且给出比较好的解答。

需要掌握基本知识点,比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画、网络通信等常见技术。

全套零基础教程已经为你们准备好了,需要的可以添加下方二维码免费领取

全套安卓基础教程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Kotlin 协程基础 | Kotlin 入门教程指南 阻塞与非阻塞 runBlocking delay是非阻塞的,Thread.sleep是阻塞的。显式使用 runBlocking 协程构建器来阻塞。 import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 在后台启动一个新的协程并继续 delay(200) "rustfisher.com".forEach { print(it) delay(280 阅读详情

相关推荐

破解 Kotlin 协程 - 入门篇

假定你对协程(Coroutine)一点儿都不了解。 通过阅读本文看看是否能让你明白协程是怎么一回事。 1. 引子 我之前写过一些协程的文章,很久以前了。那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求。 这次准备从协程用户(也...

Kotlin中文社区 2269

Kotlin协程:协程的基础与使用

协程是Coroutine的中文简称,co表示协同、协作,routine表示程序。协程可以理解为多个互相协作的程序。协程是轻量级的线程,它的轻量体现在启动和切换,协程的启动不需要申请额外的堆栈空间;协程的切换发生在用户态,而非内核态,避免了复杂的系统调用。...

LeeDuoZuiShuai的博客 1万+

一文快速入门 Kotlin 协程

一、Kotlin 协程 Kotlin 协程提供了一种全新处理并发的方式,你可以在 Android 平台上使用它来简化异步执行的代码。协程从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生的黎明之际就有了,最早使用协程的编程语言可以追溯到 1967 年的 Simula 语言。在过去几年间,协程这个概念发展势头迅猛,现已经被诸多主流编程语言采用,比如 Javascript、C#、Python、Ruby 以及 Go 等。Kotlin 协程是基于来自其他语言的既定概念 Google 官方推荐将 Kot

xiaxia20220117的博客 2165

kotlin协程入门

可以简单地将它理解成一种轻量级的线程。我们之前所学习的线程是非常重量级的,它需要依靠操作系统的调度才能实现不同线程之间的切换。而使用协程却可以仅在编程语言的层面就能实现不同协程之间的切换,从而大大提升了并发编程的运行效率。为什么使用协程?简洁性:协程使得异步代码看起来像同步代码,减少了回调地狱的问题。轻量级:协程比线程更轻量,可以在同一线程中运行多个协程。易于管理:协程可以通过结构化并发来管理生命周期,避免内存泄漏和资源浪费。

weixin_63357306的博客 1304

Kotlin:Kotlin协程基础教程

除了Kotlin提供的内置调度器,你还可以创建自定义的调度器,以满足特定的并发需求。自定义调度器通常用于控制协程的执行环境,例如,创建一个只在特定线程上运行的调度器,或者一个可以模拟不同并发模型的调度器。自定义调度器可以通过继承类并实现其方法来创建。主要的方法包括dispatch和等。在Kotlin协程中,Channel是一个用于在协程之间传递数据的通信机制。它类似于线程间的,但更轻量级,且与协程的调度紧密集成。Channel支持异步通信,允许生产者协程将数据发送到通道,而消费者协程从通道接收数据。

kkchenjj的博客 2256

ESXI 8.0虚拟机安装OpenWRT软路由详细教程

OpenWrt 是嵌入式的 Linux 路由器固件,OpenWrt在稳定运行的同时提供了强大的扩展能力,用户可以完全的定制属于自己的路由系统,满足不一样的个性化需求,本文讲解如何使用ESXI安装OpenWRT,打造属于自己的软路由。本次安装使用的是版本。默认登录信息:用户:root密码:password下载固件:https://github.com/haiibo/OpenWrt/releases/tag/X86_64【CPU配置】:4核心。

qq_27121281的博客 3911

【kotlin 协程】万字协程 一篇完成kotlin 协程进阶

在 Android 平台上,协程主要用来解决两个问题:从本质上来说,协程就是一个轻量级的线程。在使用协程之前,我们需要先引入Coroutine 的包 创建协程的方式有很多种,这里不延伸协程的高级用法(热数据通道Channel、冷数据流Flow.…),创建协程这里介绍常用的三种方式: runBlocking 启动一个协程会阻塞调用它的线程,只到里面的代码执行结束,返回值是泛型T。 launch启动一个协程不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用,返回值是一个Job asy

半身风雪 5675

Claude Code 接入 DeepSeek-V4 教程

本文介绍Claude Code的安装配置流程:1) 安装Node.js 18+和Git(Windows);2) 通过npm全局安装@anthropic-ai/claude-code;3) 配置DeepSeek API环境变量(需替换API Key);4) 启动Claude Code或配置VSCode插件。重点包括Linux/macOS和Windows的环境变量设置方法,以及VSCode插件的settings.json配置项。完成配置后即可在终端或VSCode中使用Claude Code功能。

培根芝士的专栏 2002

Kotlin协程

1、什么是协程 它其实和线程是有点类似的,可以简单地将它理解成一种轻量级的线程。要知道,我们之前所学习的线程是非常重量级的,它需要依靠操作系统的调度才能实现不同线程之间的切换。而使用协程却可以仅在编程语言的层面就能实现不同协程之间的切换,从而大大提升了并发编程的运行效率。举一个具体点的例子,比如我们有如下foo()和bar()两个方法: fun foo(){ a() b() c() } fun bar(){ x() y() z() } 在没有开启线程的情况

布里啾啾提不哩多的博客 1万+

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理

Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa

weixin_29164185的博客 333

Matlab+Matpower实战:手把手教你生成IEEE14节点FDIA攻击数据集(附完整代码)

本文提供了一份基于Matlab与Matpower工具构建IEEE14节点FDIA攻击数据集的完整实战指南。通过动态负荷数据模拟、潮流计算、状态估计及隐蔽攻击向量注入,手把手教你生成可用于电力系统网络安全研究的仿真数据集,并附有核心代码与调试技巧。

bean的博客 397

Kotlin 协程 看这一篇就够了

前言 Kotlin协程是什么,如何使用?如何结合Retrofit使用?Kotlin 的优势在哪里?相信看完这一篇你一定有所收获! 协程基本使用 若使用协程,首先我们得引入协程相关的开发包 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7-mpp-dev-11' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7-mpp-de

黄林晴 1万+

华为OD机试 - 战士技能规划设计 - 数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。你为一款动作游戏设计战士角色的技能:战士每个技能会消耗不同能量,释放技能有 2 个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态(即分段)。战士有一项爆发技巧:在单次战斗中有一次

学Java,找哪吒 223

Kotlin协程入门

前言 现在还在学习阶段,无法写的详细,先写一些自己需要记的东西。 InteliiJ开发环境 这里,我们使用免费的IntelliJ IDEA 2021.3.3 Community版本。 创建一个项目,设置如下: 创建后,项目结果如下: 可以看到,自动生成了一个Kotlin文件,可以直接点击main函数左侧的绿色三角形以运行main函数。 join()函数 fun main() = runBlocking { val job = GlobalScope.launch { delay(

Android菜鸟的专栏 1596

26. 如何给 SAP BTP Cloud Foundry 环境分配运行时内存

摘要:本文解答了SAP BTP Cloud Foundry环境中Space可用内存为0MB的问题。指出Space内存配额取决于Org配额分配,其计算方式为Org总配额减去所有运行中应用实例的内存预留总和。详细解释了SAP BTP的资源分配层级(Global account→Subaccount→Environment→Org→Space),并说明如何通过Global account的Entity Assignments查看Memory Plan配额分配(以GB为单位)。最后建议遇到问题的用户检查Subacc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1259

具身大小脑全栈全网独家复现|LLM链式推理+边缘VLA感知+毫秒级运动小脑、优化人形步态僵硬运动滞后、打通思考-行走-操作全链路适配居家工业多场景落地

高层决策大脑(异步10Hz,GPU算力):轻量化机器人微调LLM+RhinoVLA边缘视觉大模型,负责自然语言链式工序拆解、全局环境语义感知、目标物体筛选、跨机器人动作适配,输出粗粒度运动目标,不介入底层伺服计算;依托View Registry实现异构机器人动作对齐,适配多形态机器人切换;中层调度小脑(硬实时1kHz,CPU算力)

qq_36130719的博客 253

一文看透 Kotlin 协程本质

前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果……实在拿不出手! 为了更好的加深记忆和理解,更全面系统深入地学习 Kotlin 协程的知识,协程将分为三部分来讲解,本文是第一篇: Kotlin 协程实战进阶(基础篇) Kotlin 协程实战进阶(进阶篇) Kotlin 协程实战进阶(高级篇) 本文大纲 一、概述 协程的概念在1958年就开始出现(比线程还早), 目前很多语言开始原生支, Java

https://juejin.cn/user/1654096907477549/posts 7729

【项目实战】自动化测试软件VectorCAST介绍

VectorCAST是一款先进的自动化测试软件。VectorCAST是一款功能强大、易于使用的自动化测试软件。VectorCAST适用于各种嵌入式系统的测试。VectorCAST为嵌入式系统的测试提供了一种高效、可靠的解决方案。VectorCAST提供了一整套完整的测试工具,包括测试管理、代码覆盖、缺陷定位、报告生成等,以帮助开发人员提高测试效率,确保软件质量。VectorCAST支持。

奶爸的编程之路,也就一周冷个三天 2008

Kotlin进阶之协程从入门到放弃

深入浅出的介绍Kotlin中协程的概念和基本原理,并用实例详细的介绍如何上手使用协程来实现并发编程。

稀有猿诉 3714

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Kotlin:协程基础

GlobalScope.launch: 在后台启动一个新的协程并继续 runBlocking:方法会阻塞当前线程来等待 coroutineScope:只是挂起,会释放底层线程用于其他用途 delay 是一个特殊的 挂起函数 ,它不会造成线程阻塞,但是会 挂起 协程,并且只能在协程中使用。

ChinaDragon10的博客 1588

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Kotlin协程的使用

目录 引入kotlin协程 kotlin协程的三种启动方式 初识协程: 第一种启动方式(runBlocking:T) 第二种启动方式(launch:Job) 第三种启动方式(async/await:Deferred) 实现你的第一个Coroutine程序 浅析Kotlin协程 ——协程是什么?https://blog.youkuaiyun.com/qq_17798399/article/det...

青冘的技术学习博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Kotlin协程(从基础到入门)

可以理解为轻量级线程,在编程语言层面上实现不同协程之间切换,大大提升并发编程运行效率。

qq_53092981的博客 2326

可能是最全的kotlin协程+Jetpack入门教程

可能是最全的kotlin协程+Jetpack入门教程前言一、协程是什么?二、Jetpack是什么?1.引入库2.读入数据总结二级目录三级目录 文章目录前言一、协程是什么?二、Jetpack是什么?1.引入库2.读入数据总结二级目录三级目录 前言 最近一直在学习kotlin,为了能够尽快入门,所以我准备写一个简单的app练手,加上之前一直在研究Jetpack这套组件库,基于以上原因我打算用kotlin+jetpack搭建我的app框架,至于为啥用kotlin协程,之前在网上看了一篇博客Kotlin 协程 看

DDUP的博客 4630

Android Kotlin 协程(coroutine )入门篇

ps:文章会很长 协同程序(coroutine)实在是太好用了,所以我们来学习吧!

我怀里的猫的博客 9468

【Kotlin】协程

相较于 C# 中的协程(详见 →),Kotlin 中协程更灵活,难度更大。协程是一种并发设计模式,用于简化异步编程,它允许以顺序化的方式表达异步操作,避免回调地狱等问题。使用协程,可以将异步操作的代码像同步代码一样写,而无需显式地管理线程。在 Kotlin 中,协程由 kotlinx.coroutines 库提供支持。它使用 suspend 修饰符来标记挂起函数(即可暂停执行并稍后恢复执行的函数),这使得编写异步代码更加直观和简单。协程和线程具有以下异同点。

little_fat_sheep 2374
上一篇: 这一次,在“问界”上看到了拥有核心竞争力带来的巨大优势
下一篇: Android初中级面筋,跟着这几步去准备,大厂也不远了
Agent学习路线
博客等级 码龄6年 1万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值