在线程A挂起点返回后的代码怎么执行在线程B中?
来源:11-8 案例:仿 Lua 协程实现非对称协程 API

ak_star
2021-01-02
suspend fun main() {
log("main -> start")
val producer = Coroutine.create<Unit, Int>(Dispatcher()) {
200.also { log("send", it) }
}
val consumer = Coroutine.create<Int, Unit>(Dispatcher()) { param: Int ->
log("start", param)
}
while (producer.isActive && consumer.isActive) {
val result = producer.resume(Unit)
log("main -> middle")
consumer.resume(result)
}
log("main -> end")
}
输出:
20:44:44:775 [main] main -> start
20:44:44:853 [Thread-0] send 200
20:44:44:853 [Thread-0] main -> middle
20:44:44:853 [Thread-1] start 200
20:44:44:853 [Thread-1] main -> end
非对称协程,不是在线程A挂起,在线程B执行完返回线程A;那么不是在A挂起点返回后的代码都应该执行在A的线程,现在的运行结果确实在B的线程继续执行,并没有切换回来
写回答
1回答
-
非对称协程,跟线程没有什么直接关系。非对称讲的是调用处恢复执行的逻辑,也就是说你通过调用我的 resume 方法来恢复执行我,我执行完以后也会在你调用我的 resume 方法的位置给你返回,但我执行的线程跟你的可能不一样,因此至于在哪个线程恢复执行,跟实现有关系。
122021-01-03
相似问题