我正在为 jvm 建立一个基于 kotlin 协程的网络框架。Client 和 Server 类实现 CoroutineScope,coroutinecontext 的覆盖是 Dispatchers.IO,因为我很确定这是用于这种情况的正确 Dispatcher。但是,我希望在主线程上处理读取数据包,或者至少提供该选项。在没有阅读文档的情况下,我使用了 Dispatchers.Main,我现在意识到它是用于 android UI 线程的。有没有我可以用来让协程在主线程上运行的调度程序?如果没有,我将如何制作一个?
我查看了有关如何基于单个线程创建调度程序的 kotlin 文档,但除了创建新线程的 newSingleThreadContext 之外我找不到任何东西。我还发现可以从 java Executor 创建调度程序,但我仍然不确定如何将其限制为已经存在的线程。
class AbstractNetworkComponent : CoroutineScope {
private val packetProcessor = PacketProcessor()
private val job = Job()
override val coroutineContext = job + Dispatchers.IO
}
class PacketProcessor : CoroutineScope {
private val job = Job()
override val coroutineContext = job + Dispatchers.Main //Android only!
private val packetHandlers = mutableMapOf<Opcode, PacketHandlerFunc>()
fun handlePacket(opcode: Opcode, packet: ReceivablePacket, networker: Writable) {
launch(coroutineContext) {
packetHandlers[opcode]?.invoke(packet, networker)
}
}
}
因此,使用 Dispatchers.Main 由于缺少 android 组件,我得到了 IllegalStateException。有没有办法创建一个调度程序来阻止主线程直到它完成(就像 runBlocking 一样?)谢谢!