当前位置: 首页 > 知识库问答 >
问题:

静态编程语言挂起函数从Java调用时延迟后不执行

薄伟彦
2023-03-14

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

科特林代码:

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

转换器.java

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

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

共有1个答案

马淳
2023-03-14

我认为在您的情况下,程序在新的协程开始之前完成。调用main函数后,尝试延迟当前的Main ThreadMainKt.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()
    }
}

然后我想日志将显示。

 类似资料:
  • 动机: 在我们的Android项目中,我们有许多验证,比如

  • 我在kotlin文件中定义了这个函数。 想这样从Java调用它 随着 但它给了我 我意识到lambda函数的参数似乎是< code >列表 如果我把类转换成java,我可以很容易地用lambda回调函数调用那个函数。 我做错了什么

  • 有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中

  • 我想为我的游戏创建一个简单的倒计时,当游戏开始时,我想每秒调用这个函数: 我试过这个: 但应用程序不幸停止,第二次调用run函数 3周前,我刚刚开始使用android开发和静态编程语言,到目前为止,我对它了解最多。 在Xcode中使用swift时,我使用了这一行,我认为类似的东西也适用于Kotlin

  • 我知道内联函数可能会提高性能 编译器可以发出以下代码,而不是为参数创建函数对象并生成调用。(来源) 但是我发现没有kotlin为一个非内联函数创建的函数对象。为什么?

  • 这是我用来学习kotlin协同程序的一些测试代码。代码按预期工作,大约需要1秒来打印总和,但现在如果我用阻塞调用(如网络请求)替换延迟(1000),那么代码大约需要10秒来打印总和(每个调用大约需要1秒),但如果我将网络调用包装在withContext中并使用IO调度程序,则需要1秒来打印总和,因为它是在不同的线程上运行的。延迟函数是否使用某种调度程序来解除线程阻塞?