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

静态编程语言1.5通道trySendBlock()vs try SendBlock()

邵耀
2023-03-14

迁移到Kotlin 1.5时,我偶然发现了该频道新的trySendBlocking()方法的一个问题。

因此,我们有一个actor返回一个SendChannel

在Kotlin 1.4中,向参与者发送命令时,我们通常使用其通道,如下所示:

channel.sendBlocking(command)

现在,建议在Kotlin 1.5中使用以下内容:

channel.trySendBlocking(command)

很好,但是我想知道为什么不使用trySend()而不是trySendBlocking()?有些事情让我挠头:

>

  • 如果我们确定通道的容量足够大,并且参与者消耗它的速度足够快,那么通道不会被填满,并且tryDI()总是会成功。我们可以这样做来解决通道可能已满的少数情况:

    do{val result=channel.trySend(command)}while(result.isFailure)

    trySendBlocking()内部使用阻塞整个线程的runBlocking()。根据文档,“设计用于将常规阻塞代码连接到以挂起方式编写的库,以便在主要函数和测试中使用”。但在这里,它的使用方式超出了这个有文档记录的用例。它可能会阻塞整个线程。我会认为这是个坏主意?

    trySend()是线程安全的吗?如果多个线程在同一通道上同时调用trySend(),是否会出现问题?这就是我们喜欢trySendBlocking()的原因吗?

    谢谢

  • 共有1个答案

    姜嘉荣
    2023-03-14

    >

  • 也许你想改用发送()方法

    据我所知,这正是案件作者的意思。此方法是同步的,应该与块代码一起使用。如果不可用,为了将同步代码与异步代码连接起来,可以使用runBlocking方法。

    在快速查看内部之后,对我来说看起来像是线程安全的;它使用原子变量和其他与并发相关的东西,但作为这些的设计者,我不能确定。Actor应该是线程安全的。

  •  类似资料:
    • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

    • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

    • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我

    • 我是Kotlin开发的新手,我不知道如何处理这个问题。我将以下Kotlin数据类映射到MongoDB集合(Spring data MongoDB): 我想覆盖默认的 id 获取器并返回一个字符串而不是对象 Id。似乎“id”字段名称无法更改,因为我收到消息“不允许自定义id属性的字段名称!自定义名称不会被考虑!“,因此我无法使用始终建议的_id解决方案。 如何才能做到这一点?我错过了什么吗?

    • 我想从< code>local.properties文件中检索如下所示的密钥: 并通过gradle静态编程语言DSL将此值保存在我的中。稍后可以从我的项目中访问该字段。

    • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D