【问题标题】:Java timer and scalabilityJava 计时器和可伸缩性
【发布时间】:2015-09-23 02:43:44
【问题描述】:

我浏览了在线帖子,勉强但令人满意地回答了我的两个问题。

  1. 如何在 java 循环中执行计时器
  2. 单个 jvm 实例可以处理多少个线程

因此,在上述两个问题的背景下,很明显(无需太多修改)具有 4GB RAM 的 jvm 将处理低于 10k 线程的事情。关于异步基于事件的框架的所有这些东西在线程数据在其他线程中不是非常重要的上下文中是可以的。但是,如果计时器线程(循环内)中的数据对其他 10k 请求/秒很重要怎么办?

我能想到的现实生活情况是在线问卷调查。假设您有 5 份问卷。每份问卷有 10 个问题。您预计每份问卷将有 20000 名受访者。所有问卷同时开始。每个问题在另一个问题出现之前需要一分钟(例如,因为您想确保客观性)

这意味着,如果每个响应者以 1/20 秒的间隔开始,则您必须期望每秒处理至少 20000 个线程。这是因为每个请求都必须将其数据维持在一秒以上,以供下一个请求使用。

在相同的背景下,您究竟如何扩大规模以达到 10 万用户?如果有什么不清楚的地方,请询问以便我澄清。

【问题讨论】:

  • 1有什么问题?你写在timerTask的run()方法中调用的函数,可以循环调用
  • 定时器可以很容易地聚合和异步处理,不需要所有这些额外的线程 - 请参阅util.Timer,它支持单个线程上的“无限数量的定时器”。此外,不确定“现实生活”示例是否适合。

标签: java multithreading asynchronous timer scalability


【解决方案1】:

避免使用每任务线程执行模型,它不能很好地扩展。

您可以改用ScheduledThreadPoolExecutor

一般而言,我建议您广泛了解标准库,以便了解哪些工具可用,而不是尝试从头开始构建所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多