Kotlin 协程作用域

Kotlin协程作用域详解
  1. GlobalScope - 全局作用域,生命周期与应用程序一致

  2. CustomScope - 自定义作用域,可以控制其生命周期

  3. runBlocking - 阻塞当前线程直到协程完成

  4. coroutineScope - 挂起函数,创建一个子作用域

  5. supervisorScope - 子协程失败不会影响其他子协程

import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import kotlinx.coroutines.*
import java.time.LocalTime
import java.time.format.DateTimeFormatter

// 定义不同类型的协程作用域
class CoroutineScopeDemo {
    // 全局作用域 - 不推荐在生产代码中使用
    fun globalScopeExample() {
        GlobalScope.launch {
            log("GlobalScope 启动的协程")
            delay(2000)
            log("GlobalScope 协程完成")
        }
    }

    // 自定义作用域
    private val customScope = CoroutineScope(Dispatchers.Default + CoroutineName("CustomScope"))
    
    fun customScopeExample() {
        customScope.launch {
            log("CustomScope 启动的协程")
            delay(1500)
            log("CustomScope 协程完成")
        }
    }

    // 使用 runBlocking - 会阻塞当前线程
    fun runBlockingExample() {
        log("runBlocking 开始")
        runBlocking {
            launch {
                log("runBlocking 内部的协程")
                delay(1000)
                log("runBlocking 内部协程完成")
            }
        }
        log("runBlocking 结束")
    }

    // 使用 coroutineScope - 挂起函数,不会阻塞线程
    suspend fun coroutineScopeExample() {
        log("coroutineScope 开始")
        coroutineScope {
            launch {
  &nb

Kotlin 协程中,协程是可以嵌套的,而在协程作用域中启动的协程都会遵循作用域的规则。具体来说,当协程作用域被取消时,作用域中启动的所有协程都会被取消。当启动一个新的协程时,它会成为父协程的子协程,如果父协程被取消,那么所有的子协程也会被取消。 在协程作用域中嵌套两个子协程和一个普通函数时,如果普通函数没有被包装在一个协程中启动,那么它将不受协程作用域的影响,它将在当前线程中执行,并且会先于子协程执行。这是因为协程是一种轻量级的线程,它们可以在同一个线程中并发执行,但是它们需要协作才能正确地交替执行。而普通函数不是协程,它不会自动地参与到协程的协作中去。 如果你想让普通函数和子协程同时执行,你可以将普通函数包装成一个协程并在协程作用域中启动它。这样,它就会成为父协程的子协程,遵循协程作用域的规则,同时也能与其他子协程正确地协作执行。例如,可以使用 `launch` 函数启动一个新的协程来包装普通函数: ```kotlin val scope = CoroutineScope(Dispatchers.Default) scope.launch { // 第一个子协程 launch { println("子协程 1 开始执行") delay(1000) println("子协程 1 执行结束") } // 第二个子协程 launch { println("子协程 2 开始执行") delay(500) println("子协程 2 执行结束") } // 普通函数包装成的协程 launch { println("普通函数开始执行") delay(750) println("普通函数执行结束") } } ``` 在这个示例中,我们使用 `CoroutineScope` 创建了一个协程作用域,并使用 `launch` 函数分别启动了三个子协程。其中,第一个子协程会执行 1 秒钟,第二个子协程会执行 0.5 秒钟,而第三个子协程是一个包装了普通函数的协程,它会执行 0.75 秒钟。由于这三个子协程都是在同一个协程作用域中启动的,它们将会遵循协程作用域的规则,正确地交替执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值