可以选择在Java中使用Kotlin协程?

xe55xuns  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(202)

Java中是否有Kotlin协同程序的替代方案?我有一段Kotlin代码,我想在其中一个调度员上执行面部识别,同时更新另一个调度员上的边界框。我尝试将代码自动转换为Java,但协同程序部分没有转换。
代码如下所示:

withContext( Dispatchers.Default ) {
    //perform face recognition
}

withContext( Dispatchers.Main ) {
    boundingBoxOverlay.faceBoundingBoxes = predictions
    boundingBoxOverlay.invalidate()
    isProcessing.set(false)
}
hof1towb

hof1towb1#

在大多数情况下...你不能。
Kotlin协程依赖于编译器执行的转换,编译器识别suspend函数调用并专门处理它们,跟踪它们的状态并正确地恢复它们。
不幸的是,这意味着你可能最终需要将你的代码重组为基于回调的东西,最好的方法取决于你正在做什么。

qgelzfjb

qgelzfjb2#

也许你可以使用ExecutorService来实现并发行为。下面的代码可能会有所帮助,但确切的解决方案也取决于你如何使用这些方法。withContext()将并发地运行这两个方法,并等待它们都完成。

final ExecutorService executorService = Executors.newFixedThreadPool(2);

public final void withContext(){
 final Future<?> futureFacial = this.executorService.submit(this::withContextFacial);
 final Future<?> futureBounding = this.executorService.submit(this::withContextBoundingBoxes);
 futureFacial.get();
 futureBounding.get();

}
private final withContextFacial( ) {
    //perform face recognition }

private final withContextBoundingBoxes() {
    boundingBoxOverlay.faceBoundingBoxes = predictions
    boundingBoxOverlay.invalidate()
    isProcessing.set(false) }

Kotlin对协程有语言级的支持,而Java没有。这意味着你必须解决这个问题,用另一种方式建模。Java SRE中已经有多种解决方案。例如:线程、ExecutorService、ForkJoin,以及JRE之外的多个库和方法,如Actor模型或React式编程。

7qhs6swi

7qhs6swi3#

    • 否**

Java编译器不支持线程的可挂起计算。它只支持同步(阻塞)计算。
但是Java语言有一些类似于kotlin协程的东西是线程池
(线程池-从队列中并行运行任务的托管线程集合。当现有线程空闲时,将在这些线程上执行新任务)。

w3nuxt5m

w3nuxt5m4#

你可以写你的协程,然后反编译代码并使用java类作为协程,但这似乎是一种不灵活的方法,你也应该处理延续。
在Java的情况下-只需使用RXJava而不是协程,这是众所周知的并发方法

相关问题