美文网首页
Kotlin-协程-构建器

Kotlin-协程-构建器

作者: AilurusFulgens | 来源:发表于2021-03-10 22:08 被阅读0次

构建器

runBlocking

顶层函数
非挂起函数
返回T,Lambda表达值最后一行

阻塞当前线程,会等待所有其中包含的协程执行完毕

fun main() {
    println("before runBlocking: ${Thread.currentThread().name}")
    val result = runBlocking {
        // 线程:与指定的Dispatchers有关,若不指定,则与runBlocking当前线程一致
        println("before delay: ${Thread.currentThread().name}")
        delay(200)
        println("after delay: ${Thread.currentThread().name}")
        1
    }
    println("after runBlocking: ${Thread.currentThread().name}, result is $result")
    // before runBlocking: main
    // before delay: main
    // after delay: main
    // after runBlocking: main, result is 1
}

launch

CoroutineScope上的扩展函数
挂起函数
返回Job

fun main() {
    println("before runBlocking: ${Thread.currentThread().name}")
    val result = runBlocking(Dispatchers.IO) {
        // 线程:与指定的Dispatchers有关,若不指定,则与runBlocking当前线程一致
        println("before launch: ${Thread.currentThread().name}")
        launch {
            // 线程:与指定的Dispatchers有关,若不指定,则与launch当前线程一致
            println("before delay: ${Thread.currentThread().name}")
            delay(2000)
            println("after delay: ${Thread.currentThread().name}")
        }
        println("after launch: ${Thread.currentThread().name}")
        1
    }
    println("after runBlocking: ${Thread.currentThread().name}, result is $result")
    // before runBlocking: main
    // before launch: DefaultDispatcher-worker-1
    // after launch: DefaultDispatcher-worker-1
    // before delay: DefaultDispatcher-worker-3
    // after delay: DefaultDispatcher-worker-3
    // after runBlocking: main, result is 1
}

async

CoroutineScope上的扩展函数
挂起函数
返回Deferred<T>,并使用await()获取返回值T

suspend fun main() {
    println("suspend main ${Thread.currentThread().name}")
    coroutineScope {
        println("coroutineScope ${Thread.currentThread().name}")
        val first = async {
            println("first async ${Thread.currentThread().name}")
            add(1, 2)
        }
        val second = async {
            println("second async ${Thread.currentThread().name}")
            add(3, 4)
        }
        println("Awaiting concurrent sums...")
        val total = first.await() + second.await()
        println("total is $total")
    }
    // suspend main main
    // coroutineScope main
    // first async DefaultDispatcher-worker-1
    // Awaiting concurrent sums...
    // second async DefaultDispatcher-worker-2
    // total is 10
}

suspend fun add(x: Int, y: Int): Int {
    delay(1000)
    return x + y
}

coroutineScope

顶层函数
挂起函数
返回T,Lambda表达值最后一行

不阻塞主线程(与runBlocking不同),会等待所有包含的协程执行完毕后才退出。

suspend fun main() {
    coroutineScope {
        repeat(10) {
            launch { // 启动10个协程
                delay(1000L - it * 10) // 以递减的时间延迟每个协程
                print("❤️$it ")
            }
        }
    }
    // ❤️9 ❤️8 ❤️7 ❤️6 ❤️5 ❤️4 ❤️3 ❤️2 ❤️1 ❤️0 
}

coroutineScope内运行所有协程以确保如果一个失败,所有协程将被取消的惯例称为结构化并发


withContext

用于简化async启动协程后,立即使用await等待获取结果的情况

suspend fun main() {
    val a = 1
    val b = withContext(Dispatchers.IO) {
        delay(2000)
        3
    }
    println("$a")
    println("$b")
    println("${a + b}")
}
// 1
// 2
// 4

等价于

suspend fun main() {
    val c = 1
    val d = coroutineScope {
        async(Dispatchers.IO) {
            delay(2000)
            3
        }.await()
    }
    println("$c")
    println("$d")
    println("${c + d}")
}
// 1
// 2
// 4

调度器Dispatchers

当使用launchasync之类的构建器时,可以通过可选的CoroutineContext参数指定要使用的调度器。

Dispatchers.Default

普通的共享线程池,适合消耗大量计算资源的协程。
默认情况下,最大并行数等于CPU内核数,但至少为2个。

Dispatchers.IO

按需创建的共享线程池,适合运行I/O密集型的阻塞任务,如文件I/O或阻塞式的网络I/O。
任务使用的线程数受系统属性kotlinx.coroutines.io.parallelism([IO_PARALLELISM_PROPERTY_NAME])的值的限制,它默认为64个线程或内核数(按较大值)的限制。
最大可配置线程数由系统属性kotlinx.coroutines.scheduler.max.pool.size限制。

Dispatchers.Main

Android上可使用,需添加kotlinx-coroutines-android依赖,用于主线程。

Dispatchers.Unconfined

不应该在应用代码中使用。

相关文章

  • Kotlin-协程-构建器

    构建器 runBlocking 顶层函数非挂起函数返回T,Lambda表达值最后一行 阻塞当前线程,会等待所有其中...

  • 协程的启动与取消

    1、协程构建器 launch与async构建器都用来启动新协程launch,返回一个Job并且不附带任何结果值;a...

  • Kotlin-轻量级协程与线程执行比对分析

    轻量级协程与线程执行比对分析 作用域构建器 除了由不同的构建器提供协程作用域之外,还可以使用 coroutineS...

  • Kotlin协程 Coroutines

    除了由不同的构建器提供协程作用域之外(runBlocking),还可以使用 coroutineScope构建器声明...

  • kotlin<第八篇>:协程的启动与取消

    一、启动构建器 launch与async构建器都用来启动新协程: 等待一个作业: 二、启动模式 三、作用域构建器 ...

  • Kotlin协程作用域与构建器详解

    Kotlin协程作用域与构建器详解 CoroutineScope.launch{}: CoroutineScope...

  • Kotlin-协程

    开启线程的方式 使用 runBlocking 顶层函数。一般用于测试。 使用 GlobalScope 单例对象。也...

  • kotlin-协程

    Why 简化异步代码的编写。 执行严格主线程安全确保你的代码永远不会意外阻塞主线程,并增强了代码的可读性。 提升代...

  • Kotlin-协程

    协程的定义 协程可以理解为一种轻量级的线程。协程和线程的区别是线程是依靠操作系统的调度才能实现不同线程之间的切换的...

  • Kotlin-协程

    1.什么是协程? 是一套基于线程的API框架,重点:还是基于线程。 2.协程有什么用? 可以灵活地切换线程,用同步...

网友评论

      本文标题:Kotlin-协程-构建器

      本文链接:https://www.haomeiwen.com/subject/cqobqltx.html