簡體   English   中英

替代 Java 中的 Kotlin 協程?

[英]Alternative to Kotlin Coroutines in Java?

Java 中的 Kotlin 協程是否有替代方案? 我有 Kotlin 代碼,我想在其中一個調度員上執行面部識別,同時更新另一個調度員的邊界框。 我嘗試將代碼自動轉換為Java,但是協程部分沒有轉換。

代碼是這樣的:

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

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

在大多數情況下......你不能。

Kotlin 協程依賴於編譯器執行的轉換,識別suspend function 調用並特別處理它們,跟蹤它們的 state 並正確恢復它們。 Java 編譯器不這樣做。

不幸的是,這意味着您最終可能需要將您的代碼大量重組為基於回調的東西。 做到這一點的最好方法將取決於你在做什么。

也許您可以使用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 沒有。 這意味着您必須以另一種方式解決該問題並 model 解決方案。 即使考慮 Java SRE 解決方案,也有多種解決方案:Threads、ExecutorService、ForkJoin。 然后是 JRE 之外的多個庫和方法,例如 Actor model 或反應式編程。

並發運行以不斷更新。 您可以使用 java 中的服務,即使在用戶切換到另一個應用程序之后,該服務也可能會繼續運行一段時間。 點擊這里

您可以編寫協程,而不是反編譯代碼並使用 java-class 協程,但這似乎是一種不靈活的方法,您也應該處理延續。

在 java 的情況下 - 只需使用 RXJava 而不是協程,這是眾所周知的並發方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM