Java中是否有Kotlin协同程序的替代方案?我有一段Kotlin代码,我想在其中一个调度员上执行面部识别,同时更新另一个调度员上的边界框。我尝试将代码自动转换为Java,但协同程序部分没有转换。
代码如下所示:
withContext( Dispatchers.Default ) {
//perform face recognition
}
withContext( Dispatchers.Main ) {
boundingBoxOverlay.faceBoundingBoxes = predictions
boundingBoxOverlay.invalidate()
isProcessing.set(false)
}
4条答案
按热度按时间hof1towb1#
在大多数情况下...你不能。
Kotlin协程依赖于编译器执行的转换,编译器识别
suspend
函数调用并专门处理它们,跟踪它们的状态并正确地恢复它们。不幸的是,这意味着你可能最终需要将你的代码重组为基于回调的东西,最好的方法取决于你正在做什么。
qgelzfjb2#
也许你可以使用ExecutorService来实现并发行为。下面的代码可能会有所帮助,但确切的解决方案也取决于你如何使用这些方法。
withContext()
将并发地运行这两个方法,并等待它们都完成。Kotlin对协程有语言级的支持,而Java没有。这意味着你必须解决这个问题,用另一种方式建模。Java SRE中已经有多种解决方案。例如:线程、ExecutorService、ForkJoin,以及JRE之外的多个库和方法,如Actor模型或React式编程。
7qhs6swi3#
Java编译器不支持线程的可挂起计算。它只支持同步(阻塞)计算。
但是Java语言有一些类似于kotlin协程的东西是线程池。
(线程池-从队列中并行运行任务的托管线程集合。当现有线程空闲时,将在这些线程上执行新任务)。
w3nuxt5m4#
你可以写你的协程,然后反编译代码并使用java类作为协程,但这似乎是一种不灵活的方法,你也应该处理延续。
在Java的情况下-只需使用RXJava而不是协程,这是众所周知的并发方法