Kotlin 协程 future 等待超时(不可取消)

2023-12-22

鉴于我们有一个CompletableFuture f,在 kotlin 可挂起范围内我们可以调用f.await()我们将暂停直到完成。

我在使用签名实现类似功能时遇到问题f.await(t)必须暂停最大t毫秒或如果 future 在该持续时间内完成则更快返回(以先发生者为准)。

这是我尝试过的。

/**
 * Suspend current method until future is done or specified duration expires,
 * whichever happens first without cancelling the future.
 * Returns true if its done, false otherwise.
 */
suspend fun <T> ListenableFuture<T>.await(duration: Long): Boolean {
   val future = this
   try {
      withTimeout(duration) {
         withContext(NonCancellable) { // this does not help either
            future.await() // i do not expect the future itself to be cancelled
         }
      }
   } catch (t: TimeoutCancellationException) {
      // we expected this
   } catch (e: Throwable) {
      e.printStackTrace()
   }

   return future.isDone

}

fun main(args: Array<String>) = runBlocking<Unit> {
   val future = GlobalScope.future {
      try {
         repeat(5) {
            println("computing")
            delay(500)
         }
         println("complete")
      } finally {
         withContext(NonCancellable) {
            println("cancelling")
            delay(500)
            println("cancelled")
         }
      }
   }

   for (i in 0..10) {
      if (future.await(2000)) {
         println("checking : done")
      } else {
         println("checking : not done")
      }
   }
}

我的工作也需要类似的功能。但也许这个问题的解决方案也会帮助我......

其输出是

computing
computing
computing
computing
checking : done
checking : done
checking : done
checking : done
cancelling
checking : done
checking : done
checking : done
checking : done
checking : done
checking : done
checking : done

我写了一些测试代码:

fun main(args: Array<String>) = runBlocking {
    val future = calculateAsync()
    val result = future.await(2000)
    println("result=$result")
}

suspend fun <T> CompletableFuture<T>.await(duration: Long): T? {
    val future = this
    var result: T? = null
    try {
        withTimeout(duration) {
            result = future.await()
        }
    } catch (t: TimeoutCancellationException) {
        println("timeout exception")
    } catch (e: Throwable) {
        e.printStackTrace()
    }

    return result
}

@Throws(InterruptedException::class)
fun calculateAsync(): CompletableFuture<String> {
    val completableFuture = CompletableFuture<String>()

    Executors.newCachedThreadPool().submit {
        Thread.sleep(3000)
        println("after sleep")
        completableFuture.complete("Completed")
    }

    return completableFuture
}

运行此代码后,我们将得到输出:

timeout exception
result=null
after sleep

我们看到我们的扩展函数await回报null因为我们将超时设置为 2000 毫秒但是CompletableFuture3000 毫秒后完成。在这种情况下CompletableFuture被取消(其isCancelled财产回报true),但是我们运行的线程calculateAsync函数继续执行(我们在日志中看到它after sleep).

如果我们将超时时间设置为 4000 毫秒future.await(4000) in the main函数,我们将看到下一个输出:

after sleep
result=Completed

现在我们有了一些结果,因为CompletableFuture执行速度快于 4000 毫秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 协程 future 等待超时(不可取消) 的相关文章

  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • Java Spring 应用程序存在内存泄漏。系统非堆内存不断增加

    我已使用 yourkit 分析器监视我的 Web 应用程序 保留最大大小的主要对象是 SessionFactoryImpl webappclassloader 和 CGlib 对象显示 spring crone调度程序会导致内存泄漏吗 我尝
  • 要打乱的键值(整数、字符串)列表的最佳结构

    我需要在 Java 中实现一个结构 它是一个键值列表 类型为整数 字符串 并且我想对其进行洗牌 基本上 我想做类似的事情 public LinkedHashMap
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有

随机推荐

  • Javascript 检测文本区域中的滚动条

    我想知道是否有人知道我将如何检测滚动条何时出现在textarea 我目前在 JavaScript 中使用 mootools 但在让它检测滚动条时遇到问题 function has scrollbar elem id const elem d
  • 带动画的RemoveFromSuperView() - AnimationWillEnd不会触发

    我有一个 UIView 并尝试使用动画 淡入 alpha 0 0 将其从其超级视图中删除 工作正常 但视图永远不会从超级视图中删除 尽管我向 AnimationWillEnd 添加了委托 这是代码 控制台输出不会被写入 视图也不会被删除 怎
  • Swing 应用程序在哪里使用?

    现在人们真的使用 Swing 应用程序吗 我没有找到使用它们的地方 是否可以跳过 AWT 和 Swing 包 不过我学到了一些基础知识 如果您专门为网络编写内容 您可能可以跳过 Swing 但否则您绝对会遇到它 我从来没有开发过没有 Swi
  • 将 Switch 小部件添加到 ActionBar 并响应更改事件

    我可以知道如何在 ActionBar 中添加 Switch 小部件并处理单击事件或切换更改事件吗 现在我可以膨胀 ActionBar 中的 Switch 但无法响应更改事件 我已将以下内容添加到 main xml 中 menu menu
  • express.Router 和 app.get 之间的区别?

    我从 NodeJS 和 Express 4 开始 我有点困惑 我正在阅读 Express 网站 但看不到when使用路由处理程序或何时使用express Router 正如我所看到的 如果我想在用户点击时显示页面或其他内容 show例如我应
  • 在 Excel VBA 中添加到数组函数

    我正在尝试在 for 循环中将一个数组添加到 Double 数组的数组中 这是我的代码 Sub Test3 Dim a As Double i As Integer ReDim a 1 To 10 1 To 3 Dim d For i 1
  • Android Studio 3.0:无法解决模块依赖关系

    我有一个主要项目和第二个项目 模块 我导入后module项目作为模块依赖项app项目并尝试同步所有内容 我收到以下错误 Unable to resolve dependency for app debug compileClasspath
  • 迅速。如何将文本行追加到 file.txt 顶部?

    我正在实现一个小型记录器 在其中写入 TXT 文件 我希望最后一个事件位于文件顶部 但我无法使其正常工作 互联网上的所有示例都使用 fileHandle seekToEndOfFile 在文件末尾写入 这就是我所拥有的 private st
  • 将多个值从 MVC3 视图传递到 ActionMethod

    我想知道是否有人可以帮助我 我很抱歉听起来像个笨蛋 但我是 MVC3 的新手 我试图将 2 个值从视图传递到操作方法 但这并不公平 HTML Html ActionLink ASSIGN AssignTokenToDataTemplate
  • 我如何创建像 Altair 这样并排的条形图?

    我想要创造的图片 https i stack imgur com VZ0K3 png 我得到了图表的左侧 前三分之一 并尝试创建 bars2 和 text2 字段 但这不起作用 并将其添加到原始的ranked movies字段中 但这一切都
  • Groovy 方法从列表中获取随机元素

    Groovy 在管理集合方面非常强大 我有一个这样的列表 def nameList Jon Mike Alexia 我想做的是迭代 10 次 从第一个列表中获取 10 个人的随机名字 10 times Person person new P
  • 在 EKS 集群中挂载 EFS:示例部署失败

    我目前正在尝试创建一个 EFS 以在 EKS 集群中使用 我已遵循所有说明 并且大多数情况下一切似乎都正常 但是 当尝试应用 multiple pods 示例部署时here https github com kubernetes sigs
  • 如何在Java中的FlatBuffer中存储字典(地图)

    我正在从中学习平面缓冲区link https google github io flatbuffers flatbuffers guide tutorial html 没有例子演示如何存储字典 地图 这里提到了 Storing dictio
  • 测试与 docker 守护进程的连接

    我正在编写一个将自动启动 docker compose 的脚本 然而 有时 做eval docker machine env default 不会导致 docker 守护进程立即连接 并且当下一行到来时 docker compose up
  • *nix select 和 exceptfds/errorfds 语义

    The select http www opengroup org onlinepubs 007908775 xsh select html系统调用需要 3 个文件描述符集来监视 fd 的可读 可写和文件描述符上的 异常 我的选择man p
  • 使用 Apps 脚本删除 Google 表格中的空行后复制数据?

    下面的代码工作正常 它正在排序 删除重复项并删除空行 然后我只想将数据行复制到最后一个数据行之后 但代码正在复制具有空行的数据行 复制时需要避免空行 var column 3 range sort column column ascendi
  • 是否可以使用java在Excel xssf文档中查找文本并获取单元格索引,即[行号和列号]? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 使用 java 查找并获取该文本的列和行值 在Xssf文档中 使用java查找Excel文件中搜索文本的位置 这包含在Apache POI
  • PHP 多个三元运算符未按预期工作

    为什么是这样的印刷2 echo true 1 true 2 3 根据我的理解 它应该打印1 为什么它没有按预期工作 因为你写的内容与以下内容相同 echo true 1 true 2 3 如您所知 1 被评估为true 您期望的是 echo
  • 在 NeoVim/Vim 中,如何知道所有使用过的组合键?

    我想设置自己的按键绑定 但我无法确定其他插件或 neovim vim 本身使用了什么按键组合 map不显示类似的快捷方式zz 如果我不知道zz之前我的地图设置可能会使用它并覆盖原来的功能 但是 我无法确定在不同情况下存在多少未知的使用组合键
  • Kotlin 协程 future 等待超时(不可取消)

    鉴于我们有一个CompletableFuture f 在 kotlin 可挂起范围内我们可以调用f await 我们将暂停直到完成 我在使用签名实现类似功能时遇到问题f await t 必须暂停最大t毫秒或如果 future 在该持续时间内