kotlin协程、线程切换,函数方法委托

文章介绍了如何在Kotlin中使用协程进行线程切换,将耗时操作放在后台执行,然后通过函数委托将结果回调到主线程。示例代码展示了如何在Android环境中,利用runBlocking和Dispatchers管理协程,确保UI线程不被阻塞。
摘要由CSDN通过智能技术生成

kotlin协程、线程切换,函数方法委托

一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。

import kotlinx.coroutines.*

// myfun()干脏活的,目的是把long_time函数切入后台线程耗时操作。
// long_time相当于耗时的sum(),目的是把常规的sum()耗时操作调度到后台线程中操作。
fun myfun(
    a: Int,
    b: Int,
    long_time: (n1: Int, n2: Int) -> Int, result: (n: Int) -> Unit
) {
    //耗时操作放入IO线程
    runBlocking(Dispatchers.IO) {
        println("runBlocking - tid:${Thread.currentThread().threadId()}")

        val n1 = a //此处的n1和long_time_fun的n1没关系
        val n2 = b //此处的n2和long_time_fun的n2没关系

        //long_time_fun(a,b)也可以
        var r = long_time(n1, n2)

        //把结果抛回去
        result(r)
    }
}

//耗时函数,计算瓶颈模块
fun sum(a: Int, b: Int): Int {
    Thread.sleep(1000)
    println("sum - tid:${Thread.currentThread().threadId()}")
    return a + b
}

fun main(args: Array<String>) {
    println("main - tid:${Thread.currentThread().threadId()}")

    myfun(2, 3, { a, b -> sum(a, b) }) {
        println("结果1-a: $it - tid:${Thread.currentThread().threadId()}")
        runBlocking(Dispatchers.IO) {
            println("结果1-b: $it - tid:${Thread.currentThread().threadId()}")
        }
    }

    println("---")

    myfun(4, 5, { a, b -> sum(a, b) }) {
        println("结果2-a: $it - tid:${Thread.currentThread().threadId()}")
        runBlocking(Dispatchers.Default) {
            println("结果2-b: $it - tid:${Thread.currentThread().threadId()}")
        }
    }
}

main - tid:1
runBlocking - tid:22
sum - tid:22
结果1-a: 5 - tid:22
结果1-b: 5 - tid:24
---
runBlocking - tid:22
sum - tid:22
结果2-a: 9 - tid:22
结果2-b: 9 - tid:24

kotlin协程runBlocking 阻塞线程_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。runBlocking 会等待相同作用域的协程完成才退出runBlocking 本身阻塞线程,但内部运行的协程又非阻塞。kotlin的runBlocking 当内部相同作用域的所有协程都运行结束后,在 runBlocking 之后的代码才能执行, runBlocking 会阻塞所在线程。https://blog.csdn.net/zhangphil/article/details/129263455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值