【问题标题】:Future.get() timeout precision and possible alternativesFuture.get() 超时精度和可能的替代方案
【发布时间】:2026-01-08 11:00:02
【问题描述】:

我有一些受时间限制的任务。任务是对服务器的请求,结果是响应。时间约为 10 毫秒。时间结束后,我想立即(或在 2-5 毫秒内)接收结果或为空。所以我将我的任务打包在 Callable 中,并天真地希望 Future.get() 超时后会在超时后立即抛出异常。但正如我看到的 Future.get() 超时不能提供这样的精度。在我的简单测试中,它甚至有 12 毫秒的偏差,并且没有高负载。现在我知道这是 Future 的正常行为。但是我的任务仍然存在,如果有更准确的超时时间会很棒。我听说过 Java Real Time System,但它对我来说似乎是非常复杂的工具。有没有 Future.get() 和 Java Real Time System 的简单替代方案?

【问题讨论】:

  • 延迟的原因可能是任务没有足够频繁地检查中断状态。
  • 你有什么资料可以解释为什么“这是未来的正常行为”吗?我很想知道我可以有多少变化。

标签: java multithreading real-time future


【解决方案1】:

您是否考虑过在用于调用请求的同一线程中记录时间?您可以从底层线程抛出异常,当 Future.get() 被调用时,这些异常将在那里抛出。

我不确定您是否熟悉非阻塞 io,但有了它,您就不需要阻塞从流中读取并继续计算(即记录操作所用的时间。)

编辑:

java.nio.* 包是 jse1.7 及更高版本提供的非阻塞 io 包。这是一个使用它的基本示例的链接:

http://www.studytrails.com/java-io/non-blocking-io-multiplexing.jsp

【讨论】:

  • 我曾与 NIO 合作过。带网。但我看不出它对我有什么帮助,因为我仍然应该只等待 10 毫秒的响应。在那之后,结果对我来说并不有趣。 IE。不知何故,我已经发送了一条消息。当服务器计算我的请求时我应该怎么做?如果没有疯狂的 while 循环,我如何准确计算 10 毫秒。可以举个例子吗?
  • 由于cpu调度、线程上下文切换,我认为你不能保证你的进程会等待一定数量的毫秒。你能做的最好的可能是忙等待,这将像以下问题中的第一个答案一样旋转循环:*.com/questions/9143719/…
  • 忙循环不适合:(但thanx回复。
最近更新 更多