Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin runBlocking和异步返回_Kotlin_Coroutine_Kotlin Coroutines - Fatal编程技术网

Kotlin runBlocking和异步返回

Kotlin runBlocking和异步返回,kotlin,coroutine,kotlin-coroutines,Kotlin,Coroutine,Kotlin Coroutines,我在kotlin合作项目中迈出了第一步,我遇到了一个问题 为了创建Foo并从函数返回它,我需要异步调用两个重载服务方法,以获取Foo创建的一些值。这是我的代码: return runBlocking { val xAsync = async { service.calculateX() } val yAsync = async { service.calculateY() }

我在kotlin合作项目中迈出了第一步,我遇到了一个问题

为了创建
Foo
并从函数返回它,我需要异步调用两个重载服务方法,以获取
Foo
创建的一些值。这是我的代码:

   return runBlocking {
        val xAsync = async {
            service.calculateX()
        }
        val yAsync = async {
            service.calculateY()
        }
        Foo(xAsync.await(), yAsync.await())
    };

然而,在阅读日志之后,我觉得
calculateX()
calculateY()
是同步调用的。我的代码正确吗?

您的代码并不完美,但就同时运行
calculateX()
calculateY()
而言,它是正确的。但是,由于它在单线程的
runBlocking
dispatcher上启动此并发工作,并且由于您的重量级操作是阻塞而不是挂起,因此它们不会被并行化

首先要注意的是,与使用Java执行器的老式方法相比,阻塞操作不能从协同路由中获得任何好处,除了一点简单的API

第二个观察结果是,通过使用IO dispatcher,您至少可以使它们并行运行,每个线程阻塞自己的线程:

return runBlocking {
    val xAsync = async(Dispatchers.IO) {
        service.calculateX()
    }
    val yAsync = async(Dispatchers.IO) {
        service.calculateY()
    }
    Foo(xAsync.await(), yAsync.await())
};
与使用
java.util.concurrent
API相比,这里您受益于库的IO调度程序,而不必创建自己的线程池