【问题标题】:Implementing Inactivity Timeout with ScheduledExecutorService使用 ScheduledExecutorService 实现不活动超时
【发布时间】:2014-05-01 07:57:25
【问题描述】:

我们的系统处理从消息传递系统传递的消息。如果 10 秒后未收到消息,则应引发错误(不活动超时)。

我正在考虑使用ScheduledExecutorService(带有 1 个线程)。每次收到消息,我都会取消之前的超时任务并提交一个新的:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Callable timeoutTask = new Callable() {...};

...

synchronized {
    timeout.cancel();
    timeout = executor.schedule( timeoutTask, 10, TimeUnit.SECONDS);
}

在正常情况下,我们处理 ~ 1000 / 秒。这种方法会扩展吗?

【问题讨论】:

    标签: concurrency future scheduledexecutorservice


    【解决方案1】:

    如果您共享线程池并保持 timeoutTask 的运行时间较低,那应该没问题。如果您每约 1000 个/秒的任务有一个线程池,那么这将行不通。

    如果你仍然担心,你可以看看来自 Netty 项目的HashedWheelTimer (link)。这件事在安排超时方面非常有效。请注意,您还必须共享 HashedWheelTimer 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多