如何将协同程序直接分派到JVM上的主线程



我正在为jvm设置一个基于kotlin协程的网络框架。Client和Server类实现了CoroutineScope,而对CoroutineText的覆盖是Dispatchers。IO,因为我非常确信这是用于这种情况的正确Dispatcher。然而,我希望在主线程上处理读取数据包,或者至少提供该选项。在没有阅读文档的情况下,我使用了Dispatchers。Main,我现在意识到它是用于android UI线程的。有没有一个调度器可以让协同程序在主线程上运行?如果没有,我该怎么做呢?

我查阅了关于如何基于单个线程创建调度器的kotlin文档,但除了创建新线程的newSingleThreadContext之外,我找不到其他内容。我还发现可以从java执行程序创建一个调度器,但我仍然不确定如何将其限制在一个已经存在的线程中。

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)
}
}
}

调度员也是如此。Main由于缺少android组件,我收到了一个IllegalStateException。有没有办法创建一个调度器来阻塞主线程直到它完成(就像runBlocking一样?)谢谢!

runBlocking正是您所需要的。它创建一个调度器,并在协同程序上下文中设置它。您可以使用访问调度员

coroutineContext[ContinuationInterceptor] as CoroutineDispatcher

然后你可以把它传递给一个实现CoroutineScope的对象,或者你想用它做的任何事情

import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO
import kotlin.coroutines.ContinuationInterceptor
fun main() {
println("Top-level: current thread is ${Thread.currentThread().name}")
runBlocking {
val dispatcher = coroutineContext[ContinuationInterceptor]
as CoroutineDispatcher
ScopedObject(dispatcher).launchMe().join()
}
}
class ScopedObject(dispatcher: CoroutineDispatcher) : CoroutineScope {
override val coroutineContext = Job() + dispatcher
fun launchMe() = launch {
val result = withContext(IO) {
"amazing"
}
println("Launched coroutine: " +
"current thread is ${Thread.currentThread().name}, " +
"result is $result")
}
}

这将打印

Top-level: current thread is main
Launched coroutine: current thread is main, result is amazing

根据使用协同程序进行UI编程的指南kotlinx.协同程序有三个模块为不同的UI应用程序库提供协同程序上下文:

  • kotlinx协同程序android——Dispatchers。Android的主上下文应用程序
  • kotlinx协同程序javafx——Dispatchers。JavaFx UI的JavaFx上下文应用程序
  • kotlinx协同程序摇摆不定——Dispatchers。Swing UI的Swing上下文应用程序

此外,UI分配器可通过kotlinx-coroutines-core中的Dispatchers.Main获得,相应的实现(Android、JavaFx或Swing)由ServiceLoader API发现。例如,如果您正在编写JavaFx应用程序,您可以使用Dispatchers.MainDispachers.JavaFx扩展,它将是相同的对象。

相关内容

  • 没有找到相关文章

最新更新