Java线程-产生大量线程的替代方案

Java线程-产生大量线程的替代方案,java,multithreading,client-server,simulation,Java,Multithreading,Client Server,Simulation,我目前正在创建一个模拟程序,模拟客户在一个大型多人在线游戏的地图上移动。我必须有一个网格来表示地图,它包含客户端对象。这些客户端必须在网格中随机移动,每个客户端都与服务器对象通信 此时,我为每个客户机启动一个新线程,它在其“服务器”中以每秒随机的移动方向调用一个方法 在我开始添加大量客户机(~5000)之前,这一切都很正常,在这些客户机中,程序崩溃,出现“java.lang.OutOfMemoryError:无法创建新的本机线程”异常 有没有其他方法可以处理如此大量的客户机,而不让它们各自成为单

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

此时,我为每个客户机启动一个新线程,它在其“服务器”中以每秒随机的移动方向调用一个方法

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

有没有其他方法可以处理如此大量的客户机,而不让它们各自成为单独的线程


谢谢你,丹。我可以想出两种方法

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

2-真实地分配你的客户
使用JMeter或其他分布式测试套件将线程分布到多台计算机上。

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

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

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

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


您是否考虑过可能会使用线程不足的库,这里有很多方法。哪一个可能是最好的取决于你的目标是什么。此外,如果服务器是通过网络或本地进程与您交谈的远程计算机,那么假设该场景是一个负载测试,那么按顺序执行这些操作并不是什么测试!该场景是负载测试吗?也就是说,网络是模拟的还是真实的?问题是客户机保存在一个集合中,因此保存在一个VM中。另外,问题是在服务器对象上调用方法,这让我相信实际涉及的服务器。我同意这个答案,这是一个过度使用线程的经典示例。如果您希望客户端随机运行,请选择一个随机数并更新该客户端。问题的一个缺点,而不是您的答案:)+1购买,谢谢您的评论。网络确实是在一个虚拟机中模拟和运行的,但模拟环境包含数十台服务器和许多客户端。我将采用顺序法,看看我的测试结果是否可行。谢谢谢谢你!我会调查并测试它!