在socket上使用客户端的java Performant多线程
目前我有一个项目,我们开发了一个Java Texas Holdem应用程序。当然,这个应用程序是基于客户机-服务器socket系统的。我将所有加入的客户机(我使用socketServer.accept()
方法获取它们)保存在ArrayList
中。目前,我为每个加入的客户端创建了一个线程,它会永久性地检查客户端是否向服务器发送任何数据。我的同学告诉我,如果我创建一个大线程,遍历整个客户机ArrayList
,并检查每个客户机inputstreamreader
,会更好。我应该相信他吗
# 1 楼答案
这两种方法都不可行。每个连接都有一个线程将很快耗尽任何加载系统中的资源。让一个线程ping一个循环中的所有连接将产生糟糕的性能
正确的方法是在套接字上进行多路复用——有一个合理数量的线程(16个,为什么不),在这16个线程之间分配所有套接字,并使用select()variant在这些套接字上进行多路复用——Java中对此可用的任何方法
# 2 楼答案
如果你的应用程序有很多客户端,那么为每个套接字创建一个线程不是一个好主意
我建议调查外部图书馆,以及它们如何处理它们之间的联系。例如:http://netty.io/,https://mina.apache.org/