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