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