gpt4 book ai didi

java - JVM:是否可以操纵帧堆栈?

转载 作者:行者123 更新时间:2023-11-30 08:18:46 25 4
gpt4 key购买 nike

假设我需要在同一个线程中执行N 个任务。任务有时可能需要来自外部存储的一些值。我事先不知道哪个任务可能需要这样的值(value)以及何时。一次获取 M 个值比在 M 个外部存储查询中获取相同的 M 个值要快得多。

请注意,我不能指望任务本身的合作,它们可以被认为只不过是 java.lang.Runnable 对象

现在,在我看来,理想的程序应该是这样的

  1. 循环执行所有任务。如果任务请求外部值,请记住这一点,暂停任务并切换到下一个任务。
  2. 一次获取上一步请求的所有值。
  3. 删除所有已完成的任务(暂停的任务不算完成)。
  4. 如果仍有剩余任务,请转到步骤 1,但不执行任务,继续从挂起状态执行。

据我所知,“暂停”和“恢复”某物的唯一方法是从 JVM 堆栈中删除其相关帧,将它们存储在某个地方,然后将它们推回堆栈并让 JVM 继续。

是否有任何标准(不涉及比 JVM 字节码更低级别的黑客攻击)方法来做到这一点?

或者您能否建议另一种可能的方法来实现这一点(除了启动 N 个线程或使任务以某种方式协作之外)?

最佳答案

可以使用类似 quasar 的东西通过代理进行堆栈切片。来自任务的某种程度的合作是有帮助的,但是可以使用 AOP 从外部插入悬挂点。

(IMO 最好明确说明正在发生的事情(例如使用 FutureForkJoinPool)。如果一些普通代码在一个线程上运行了一段时间,然后“神奇地”挂起并跳转到另一个线程,这在调试或推理时可能会非常困惑。使用现代语言和库,明确异步边界的开销不应该是压倒性的。如果您的任务是根据通用类型编写的那么传递像 scalaz Future 这样的东西就相当容易了。但这不能满足你给定的要求)。

关于java - JVM:是否可以操纵帧堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com