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