【问题标题】:Java Threading - Alternative to spawning a huge amount of threadsJava 线程 - 生成大量线程的替代方案
【发布时间】:2011-12-06 19:48:06
【问题描述】:

我目前正在创建一个模拟程序来模拟客户在大型多人在线游戏的地图上移动。我必须有一个网格来表示包含客户端对象的地图。这些客户端必须在网格中随机移动,每个都与一个服务器对象通信。

目前我为每个客户端启动一个新线程,它在其服务器中调用一个方法,每秒具有随机的移动方向。

在我开始添加大量客户端(约 5000 个)之前,这一切正常,程序崩溃并出现“java.lang.OutOfMemoryError:无法创建新的本机线程”异常。

有没有另一种方法来处理如此大量的客户,而不是每个客户都是一个单独的线程?

谢谢,丹

【问题讨论】:

标签: java multithreading client-server simulation


【解决方案1】:

你到底为什么要给每个客户自己的线程?只需让一个线程执行以下操作:

for (;;) {
    for (Client c : clients) {
        c.update();
    }
    Thread.sleep(1000);
}

这样做的好处是保证了公平性(所有客户端都会更新,即使系统过载),并且服务器不需要是线程安全的。此外,for-loop 比切换线程效率更高,消耗的内存更少(每个线程都分配了一个堆栈)。

【讨论】:

  • 假设场景是负载测试,按顺序执行它们并不是什么测试!
  • 场景是负载测试吗?也就是说,网络是模拟的还是真实使用的?问题是客户端保存在一个集合中,因此在单个 VM 中。此外,问题是在服务器 object 上调用方法,这让我相信实际的服务器参与其中。
  • 我同意这个答案,这是一个过度使用线程的经典例子。如果您希望客户端随机运行,请选择一个随机数并更新该客户端。
  • 问题的缺点,而不是你的答案:) +1
  • 各位,谢谢你们的cmets。网络确实是模拟并运行在单个虚拟机中,但模拟环境包含数十台服务器以及许多客户端。我将采用顺序方法,看看我的测试结果是否可行。谢谢!
【解决方案2】:

您是否考虑过为此使用参与者并发模型? Akka 为此提供了一个成熟的基于库的 actor 实现。它允许您创建大量可以使用消息传递相互通信的对象。它由线程池支持。

http://akka.io/docs/akka/1.2/java/untyped-actors.html

【讨论】:

  • 谢谢!我会研究它并测试它!
【解决方案3】:

我能想到两种方法。

1 - 让每个线程包含一组客户端。

而不是每个线程只有 1 个客户端。尝试为每个线程收集一组 X 客户端。然后循环移动每个客户端。

2 - 真正分配您的客户

使用 JMeter 或其他分布式测试套件将线程分布在多台计算机上。

【讨论】:

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