我正在用 java 开发一个网络服务器,它将为其客户端提供 websocket 通信。有人建议我在处理许多客户端时使用线程池,因为它比每个客户端使用一个线程更节省时间。
我的问题很简单,Javas ExecutorService、newFixedThreadPool 是否能够处理可运行任务队列,并在其中调用线程阻塞方法?
换句话说,我想我想知道这个线程池是否是异步的?
我问的原因是我尝试使用 newFixedThreadPool 和 2 个线程。然后,当我将 3 个客户端连接到服务器时,我只能接收来自前两个客户端的命令。但我想我可能做错了什么,这就是我问的原因。
可运行任务也处于无限 while 循环中(仅在客户端断开连接时结束)。
最佳答案
嗯,这取决于您的实现。最简单的情况是让客户端保持线程 Activity 状态直到断开连接(或由于超时而被踢出)。在这种情况下,您的线程池效率不是很高。我只会重用断开连接的用户线程,而不是创建新线程(这很好,但并不真正相关)。
第二种情况是仅在需要时激活线程(假设当客户端发送或接收消息时)。在这种情况下,您需要记住服务器端(例如保留一个id),以便能够在不需要时切断线程连接,并在需要时重新建立它。为此,您必须将套接字保留在某处,但不绑定(bind)到任何特定线程。
我实际上没有自己编写代码,但我不明白为什么它会起作用,因为这是网站使用的机制(即 HTTP 协议(protocol))
关于java - 使用阻塞方法为多个客户端提供服务时的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23597803/