Kotlin协程

本文参考自Jetbrains Kotlin官方文档 引 在我看来,Kotlin可以作为Java的强化版,在引入现代化语法的同时,还完美兼容了Java丰富的生态 而协程作为Kotlin最重要的语言特性,自然不可忽视,他进一步完善了异步模型,让异步编程更加简单,优雅 由于项目需要,重新复习一下Kotlin协程并查缺补漏,并在此记录一下 协程基础 基本协程程序 1 2 3 4 5 6 7 8 fun main() { GlobalScope.launch { // 在后台启动一个新协程,并继续执行之后的代码 delay(1000L) // 非阻塞式地延迟一秒 println("World!") // 延迟结束后打印 } println("Hello,") //主线程继续执行,不受协程 delay 所影响 Thread.sleep(2000L) // 主线程阻塞式睡眠2秒,以此来保证JVM存活 } 在本段代码中,GlocalScope.launch代码块中的协程作用域为全局作用域,只要程序还在运行该协程就可以一直运行 开启协程后线程不会堵塞,即使协程没有执行完毕县城也会结束,因此要在协程结束后阻塞主线程等待协程执行完毕 delay()是一个挂起函数,挂起函数会暂停当前协程,并等待一段时间后恢复,不阻塞线程 Thread.sleep()是阻塞式函数,会阻塞当前线程,并等待一段时间后继续执行 一个线程上可以运行多个协程,挂起函数不会阻塞线程,只会将当前线程调整为执行另外一个协程,所以线程不会因为协程延时而阻塞 桥接阻塞与非阻塞 1 2 3 4 5 6 7 8 9 10 fun main() { GlobalScope.launch { // 启动一个新协程 delay(1000L) println("World!") } println("Hello,") runBlocking { delay(2000L) } } runBlocking()可以将一个协程转换为阻塞式,阻塞式代码会阻塞当前线程,直到协程执行完毕 1 2 3 4 5 6 7 8 fun main() = runBlocking<Unit> { GlobalScope.launch { delay(1000L) println("World!") } println("Hello,") delay(2000L) } 也可以将整个函数体转换为阻塞式,阻塞式代码会阻塞当前协程,直到协程执行完毕 ...

2024-09-07 · 13 分钟 · Nebula

Kotlin

类型 赋值 1 2 3 var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] 常规类型定义 1 2 3 4 5 6 7 8 var a1: Int = 1 //显式定义类型 var a2 = 1//默认赋值机制:若值类型等于目标类型,可省略类型 val b: String //也可以先定义后赋值 b = "1" val c: Byte = 2 var d = c.toInt()//基本类型没有子集用法 println(a.toString() + b)//不可直接进行运算,需要调用to类型方法 数字/无符号类型定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 val one = 1 // Int val threeBillion = 3000000000 // Long val oneLong = 1L // 我们也可以在数字后面添加大写字母L来表示这是一个Long类型的数值 val oneByte: Byte = 1 //Int类型数据也可以在符合其他类型范围时自动转换 val a = 1_000_000_000//通过下划线分割长数字使其更直观 val a = 0xAF//0x表示十六进制 val a = 0b1001 //0b前缀表示二进制数据,后面的1010对应着十进制的9 val b: UByte = 1u // UByte类型, 由变量提供的类型 val s: UShort = 1u // UShort类型, 由变量提供的类型 val l: ULong = 1u // ULong类型, 由变量提供的类型 val a1 = 42u // UInt类型,根据数字大小自动推断得到 val a2 = 0xFFFF_FFFF_FFFFu // ULong类型,根据数字大小自动推断得到 val a = 1UL // ULong类型,直接使用后缀标记 getter和setter定义 field表示变量的属性,可以使用getter和setter来访问 ...

2024-08-09 · 33 分钟 · Nebula