java - 使用阻塞方法为多个客户端提供服务时的线程池

标签 java multithreading client-server threadpool executorservice

我正在用 java 开发一个网络服务器,它将为其客户端提供 websocket 通信。有人建议我在处理许多客户端时使用线程池,因为它比每个客户端使用一个线程更节省时间。

我的问题很简单,Javas ExecutorService、newFixedThreadPool 是否能够处理可运行任务队列,并在其中调用线程阻塞方法?

换句话说,我想我想知道这个线程池是否是异步的?

我问的原因是我尝试使用 newFixedThreadPool 和 2 个线程。然后,当我将 3 个客户端连接到服务器时,我只能接收来自前两个客户端的命令。但我想我可能做错了什么,这就是我问的原因。

可运行任务也处于无限 while 循环中(仅在客户端断开连接时结束)。

最佳答案

嗯,这取决于您的实现。最简单的情况是让客户端保持线程 Activity 状态直到断开连接(或由于超时而被踢出)。在这种情况下,您的线程池效率不是很高。我只会重用断开连接的用户线程,而不是创建新线程(这很好,但并不真正相关)。

第二种情况是仅在需要时激活线程(假设当客户端发送或接收消息时)。在这种情况下,您需要记住服务器端(例如保留一个id),以便能够在不需要时切断线程连接,并在需要时重新建立它。为此,您必须将套接字保留在某处,但不绑定(bind)到任何特定线程。

我实际上没有自己编写代码,但我不明白为什么它会起作用,因为这是网站使用的机制(即 HTTP 协议(protocol))

关于java - 使用阻塞方法为多个客户端提供服务时的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23597803/

相关文章:

java - 创建名称为 'CommunityService' 的 bean 时出错

java - 命名查询和分页

Java:如何修复挂起的线程?

java - 如何确保 Java 线程永远不会运行无限循环?

java - for循环中的同步方法

wcf - 如何使用 silverlight 应用程序中的遗留业务逻辑?

Java 客户端/服务器应用程序 - 如何从服务器端获取输入类型?

java - 网络应用程序如何连续轮询队列?还是必须是另一项服务?

java - 排除Java项目中的特定警告

java - 将数据写入 OutputStream 而不使用 CLDC 关闭