使用await时异步阻塞吗

编程入门 行业动态 更新时间:2024-10-24 12:30:33
本文介绍了使用await时异步阻塞吗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在以下代码中,运行两个异步:

In the following code two asyncs are run:

import kotlinx.coroutines.* import kotlin.system.* fun main() = runBlocking<Unit> { val time = measureTimeMillis { val one = async { doSomethingUsefulOne() } val two = async { doSomethingUsefulTwo() } two.await() one.await() println("Finished") } } suspend fun doSomethingUsefulOne(): Int { delay(3000L) println("first") return 13 } suspend fun doSomethingUsefulTwo(): Int { delay(1000L) println("second") return 29 }

为什么不首先打印完成"?文档说了关于await:

Why is "Finished" not printed first? The docs says this about await:

等待该值完成而不会阻塞线程

Awaits for completion of this value without blocking a thread

推荐答案

通过稍微修改代码,人们将获得一些见解.让我们将经过的时间和当前线程添加到打印语句中,以查看发生了什么:

By slightly modifying the code, one will gain some insights. Let's add the elapsed time and the current thread to the print statements to see, what's going on:

在科特林游乐场执行

import kotlinx.coroutines.* import kotlin.system.* private val started = System.currentTimeMillis() private fun debug(s: String) { val elapsed = System.currentTimeMillis() - started println("[$elapsed] $s -- ${Thread.currentThread()}") } fun main() = runBlocking<Unit> { val time = measureTimeMillis { val one = async { doSomethingUsefulOne() } val two = async { doSomethingUsefulTwo() } debug("awaiting") two.await() one.await() debug("Finished") } debug("time = $time") } suspend fun doSomethingUsefulOne(): Int { delay(3000L) debug("first") return 13 } suspend fun doSomethingUsefulTwo(): Int { delay(1000L) debug("second") return 29 }

与-Dkotlinx.coroutines.debug一起运行时,应该会看到类似于

When run with -Dkotlinx.coroutines.debug one should see something similar to

[46] awaiting -- Thread[main @coroutine#1,5,main] [1056] second -- Thread[main @coroutine#3,5,main] [3054] first -- Thread[main @coroutine#2,5,main] [3054] Finished -- Thread[main @coroutine#1,5,main] [3054] time = 3013 -- Thread[main @coroutine#1,5,main]

只有一个线程.

如果await阻止了线程,则程序可能不会终止.

If await had blocked the thread, the program could not have terminated.

更多推荐

使用await时异步阻塞吗

本文发布于:2023-11-25 09:00:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1629143.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:await

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!