我想要了解java中的多线程设计。在每个字符的线程和每个映射/区域的线程之间。哪个更有优势(或其他方式),游戏服务器可以处理3000多个玩家。
答案 0 :(得分:12)
这些都不会给你带来很好的可扩展性。线程占用相当多的空间 - 例如默认情况下,32位系统上的堆栈大小为256K,因此对于3000个用户,只需启动3000个线程就需要750MB,这是在他们为数据分配任何内存以进行实际工作之前。
每用户线程将对可用用户数量设置一个硬限制,与服务器可能使用不同设计处理的用户相比,这可能是人为压低的。在这方面,每个区域的线程可能略微更好,但它也可能限制区域的数量。
大量线程具有显着的任务切换开销。为避免这种情况,我会尝试从设计中删除线程的“所有权”,并使用工作池,例如ExecutorService。游戏处理分为工作单元,然后您将其提交到池中。池通常设置为允许与核心数相同的线程,以便您获得最高效的执行。 (如果线程是I / O绑定的,则可以使用比核心更多的线程。)
答案 1 :(得分:0)
一般来说,线程不会扩展。 3000+线程会导致严重的性能问题。