从 Java 调用时,Kotlin 挂起函数在延迟后不执行

Kotlin suspend function not executing after delay when called from Java

提问人:MXC 提问时间:1/22/2022 最后编辑:MXC 更新时间:1/24/2022 访问量:695

问:

我正在尝试从我的 Java 类中调用这个 Kotlin 挂起代码。该解决方案基于此处提到的内容。https://stackoverflow.com/a/52887677/5140533

Kotlin 代码:

Main.kt

suspend fun doWorld() = coroutineScope {
    launch {
        println("Thread name2 ${Thread.currentThread().name}")
        delay(2000L)
        println("Hello world")
    }
}
@OptIn(DelicateCoroutinesApi::class)
fun doSomethingAsync() =
    GlobalScope.future { doWorld() }

Converter.java

public class Converter {
    public static void main(String[] args) {
       MainKt.doSomethingAsync();
    }
}

当我从 Java 类调用时,我看不到任何 print 语句。有人可以解释一下到底发生了什么以及我如何纠正这一点吗?doSomethingAsync()

java kotlin kotlin-coroutines

评论

1赞 Sergio 1/22/2022
你能展示一下你是如何从Java中调用它的吗?
0赞 MXC 1/23/2022
@Sergey,我更新了代码并添加了 java 代码。

答:

1赞 Sergio 1/23/2022 #1

我认为在您的情况下,程序在新的协程开始之前完成。调用后尝试延迟函数中的电流:Main ThreadmainMainKt.doSomethingAsync()

public class Converter {
    public static void main(String[] args) {
       MainKt.doSomethingAsync();
       try {
            TimeUnit.MILLISECONDS.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Or use MainKt.doSomethingAsync().get()
    }
}

然后我想日志将显示出来。

评论

2赞 Sam 1/23/2022
因为返回 a ,所以您可以改用 ,它只会等待所需的时间。GlobalScope.futureCompletableFutureMainKt.doSomethingAsync().get();
0赞 MXC 1/24/2022
@sam 试过了,它奏效了。谢谢!