我经常听说,拥有一个负责与客户端的所有通信的线程被认为是“好的设计”。
但是,现在我有多个线程与其他服务器通信以处理客户端请求。
当前设计会将响应排队以发送给选择线程。然后,选择线程将响应出队并将它们发送到适当的客户端。
在我看来,这太愚蠢了。我有大约 30 个线程准备向客户端发送响应,它们都将它们排入队列,并让一个选择线程将它们一一发送。
假设一个封闭的系统,是否没有办法安全地绕过此限制并从与最初接受客户端请求的线程没有(或者如果没有相同)选择器的线程发送?如果是这样,怎么办?
最佳答案
Assuming a closed system, is there no way to safely bypass this limitation
没有这样的限制。您可以从任何您喜欢的线程发送。
and send from a thread that doesn't have a (or if he does not the same) selector as the thread that originally accepted the client request? If so, how?
只需调用SocketChannel.write()
。唯一需要将写入写入选择器线程的情况是,如果您收到短写入或零长度写入,在这种情况下,需要为 OP_WRITE 注册 channel 、排队数据等。
关于java-nio : send from different thread than selecting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40049176/