【问题标题】:Is there a way to launch a runnable within a Kotlin coroutine scope?有没有办法在 Kotlin 协程范围内启动可运行文件?
【发布时间】:2020-01-04 08:41:57
【问题描述】:

上下文是我需要使用一些使用旧世界线程模型的遗留 Java 代码。线程池执行器、调度器和可运行对象和线程。

但是,我的新代码是所有协程兼容的。

所以,给定一个可运行的

val runnable = Runnable { 
    print("Hurray")
}

有没有更好的方法在协程范围内运行这个可运行文件,而不是以下感觉有点笨拙的方法(你实际上只是在绕过你试图运行一个可运行文件并将其压缩到协程中的事实)

GlobalScope.launch(Dispatchers.IO) { runnable.run() }

有没有办法与可运行程序和协同程序互操作?

【问题讨论】:

  • 这个问题非常广泛。不清楚你想做什么。你是从 Kotlin 调用 Java 还是从 Java 调用 Kotlin? Java 代码接受什么作为输入和输出什么?

标签: java multithreading kotlin kotlin-coroutines


【解决方案1】:

鉴于您在问题中的全部输入,这就是您执行Runnable 所需的全部内容:

runnable.run()

现在,如果您隐含地假设该可运行对象背后存在一些持久计算或阻塞 I/O,并且您不想阻塞当前线程,那么您必须将其分派到后台线程池,即与您在 Java 中必须做的完全一样。在这种情况下,您将不得不写出所谓的“笨拙”成语。

如果您希望能够编写 runnable.run() 并让 Kotlin 以某种方式自动将您的阻塞 IO 代码转换为挂起,这从根本上是不可能的。在这种情况下,Java 代码会执行本机系统调用,这会阻塞调用线程,并且无法绕过这一事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 2021-02-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2021-11-16
    • 2018-07-01
    相关资源
    最近更新 更多