有没有办法在 Kotlin 协程范围内启动可运行的?

Adi*_*and 6 java multithreading kotlin kotlin-coroutines

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

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

所以,给定一个可运行的

val runnable = Runnable { 
    print("Hurray")
}
Run Code Online (Sandbox Code Playgroud)

有没有比以下更好的方法在协程范围内运行这个 runnable 感觉有点笨拙(你真的只是绕过你试图运行一个 runnable 并在协程中挤压它的事实)

GlobalScope.launch(Dispatchers.IO) { runnable.run() }
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以与 runnables 和协程互操作?

Mar*_*nik 3

考虑到您在问题中的全部输入,这就是执行以下操作所需的全部内容Runnable

runnable.run()
Run Code Online (Sandbox Code Playgroud)

现在,如果您隐式假设该可运行对象后面有一些持久的计算或阻塞 I/O,并且您不想阻塞当前线程,那么您必须将其分派到后台线程池,这是完全相同的你必须用Java来做。在这种情况下,你就必须写出你所说的“笨拙”的习语。

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