我目前正在创建一个模拟程序来模拟在大型多人在线游戏地图中移动的客户。我必须有一个网格来表示地图,它保存客户端对象。这些客户端必须随机移动网格,每个客户端都与Server对象进行通信。
目前,我为每个客户端启动一个新线程,并在每个客户端随机移动方向调用一个方法。
这很好用,直到我开始添加大量客户端(~5000),程序崩溃,我得到一个“java.lang.OutOfMemoryError:无法创建新的本机线程”异常。
是否有另一种方法可以处理如此大量的客户而不是每个客户都是一个单独的线程?
谢谢,Dan
答案 0 :(得分:4)
为什么你在给每个客户提供自己的线程?只需要一个线程就可以执行以下操作:
for (;;) {
for (Client c : clients) {
c.update();
}
Thread.sleep(1000);
}
这样做的好处是公平性得到保证(所有客户端都会更新,即使系统过载),服务器也不需要是线程安全的。而且,for循环比切换线程更有效,将消耗更少的内存(每个线程都分配了一个堆栈)。
答案 1 :(得分:2)
您是否考虑过使用actor并发模型? Akka为此提供了一个成熟的基于库的actor实现。它允许您创建大量可以使用消息传递相互通信的对象。它由一个线程池支持。
答案 2 :(得分:1)
我可以通过两种方式来思考。
而不是每个线程只有一个客户端。尝试每个线程拥有一组X客户端。然后遍历移动每个客户端的客户端。
使用JMeter或其他分布式测试套件在多台计算机之间传播线程。