【问题标题】:Performant Multi Threading with Clients on a socket在套接字上使用客户端的高性能多线程
【发布时间】:2015-10-06 16:43:51
【问题描述】:

目前我有一个项目,我们在其中开发 Java 德州扑克应用程序。当然,这个应用程序是基于客户端服务器套接字系统的。我将所有加入的客户(我使用socketServer.accept() 方法获取它们)保存在ArrayList 中。目前我为每个加入的客户端创建一个线程,它会永久检查客户端是否向服务器发送任何数据。我的同学告诉我,如果我创建一个大线程会更好,它遍历整个客户端ArrayList 并检查每个客户端inputstreamreader。我应该相信他吗?

【问题讨论】:

  • 如果您使用阻塞的套接字,则不能有 1 个线程从所有套接字的输入流中读取,因为第一个读取调用将阻塞,直到该客户端作为发送数据,这意味着您将阻塞线程从其他流中读取。但是,您可以切换到非阻塞实现,然后在单个线程上处理所有读/写操作(如果您愿意,甚至可以接受同一线程上的连接)。查看this answer
  • 你的英语很好。为了回答你的问题,让我们从电影语录中提取。你信任他吗?你的心告诉你什么?如果答案是肯定的,那就去做吧。如果没有,那么研究/做你和他的方法来建立你的信心并证明你的情况。当有疑问时信任代码,而不是人。至少在作为开发人员的范围内
  • 使用nettynetty.io
  • 感谢您的回答。我会看看netty.io

标签: java multithreading sockets serversocket


【解决方案1】:

如果您的应用程序有很多客户端,那么为每个 Socket 创建一个线程并不是一个好主意。

我建议您研究一下外部库以及它们如何处理它们的连接。示例:http://netty.io/https://mina.apache.org/

【讨论】:

  • 感谢您的回答。我会看看那些外部库。
【解决方案2】:

这两种方法都不可行。每个连接都有一个线程将很快耗尽任何加载系统中的资源。让一个线程在一个循环中 ping 所有连接会产生糟糕的性能。

正确的方法是在套接字上多路复用——拥有合理数量的线程(16 个,为什么不),在这 16 个线程之间分配所有套接字,并使用 select() 变体在这些套接字上多路复用——Java 中可用的任何东西这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2021-02-09
    相关资源
    最近更新 更多