withContext CoroutineScope协程切换,kotlin

 withContext CoroutineScope协程切换,kotlin

        <dependency>
            <groupId>org.jetbrains.kotlinx</groupId>
            <artifactId>kotlinx-coroutines-core</artifactId>
            <version>1.4.2</version>
        </dependency>

import kotlinx.coroutines.*

fun myFun(
    a: Int,
    b: Int,
    temp: (m: Int, n: Int) -> Int, result: (ret: Int) -> Unit
) {
    CoroutineScope(Dispatchers.IO).launch {
        //耗时操作放入IO协程
        println("($a,$b)Dispatchers.IO @tid:${tid()}")
        var r = temp(a, b)

        //切换协程
        withContext(Dispatchers.Default) {
            //结果抛回去
            result(r)
        }
    }
}

//假设是耗时计算,瓶颈模块
fun longTime(a: Int, b: Int): Int {
    Thread.sleep(500)
    println("sum($a,$b) @tid:${tid()}")
    return a + b
}

fun main(args: Array<String>) {
    println("main @tid:${tid()}")

    myFun(1, 2, { a, b -> longTime(a, b) }) {
        println("(1,2)=$it @tid:${tid()}")
    }

    myFun(3, 4, { a, b -> longTime(a, b) }) {
        println("(3,4)=$it @tid:${tid()}")
    }

    Thread.sleep(3000)
}

fun tid(): Long {
    return Thread.currentThread().threadId()
}

kotlin协程、线程切换,函数方法委托_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。结果1-b: 5 - tid:24。结果2-a: 9 - tid:22。https://blog.csdn.net/zhangphil/article/details/130161705

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/131310300