[英]How to read SocketChannel in one thread, and write from n threads?
我有一个socketChannel
(java.nio.channels.SocketChannel)监听读取请求(来自多个客户端)。 它将每个请求存储在请求队列中 。
还有socketChannel.configureBlocking(false)
然后我希望多个线程一次从R equest Queue获取一个请求并写入socketChannel
我从文档中读到了以下内容。
套接字通道可以安全地由多个并发线程使用。 它们支持并发读写,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。
由于只能写入1个线程,在多次写入的情况下我该怎么办?
您可以使用自己的锁synchronized
或ReentrantLock
,或者对消息进行排队,让一个线程执行实际写入。
写入的问题是你一次只能原子地写一个字节,如果你写了多个字节,你可能会发送一些但不是所有数据,在这种情况下,另一个线程可以尝试写入它的消息,你得到一个损坏的消息。
我有一个
java.nio.channels.SocketChannel
侦听读取请求(来自多个客户端)。
不,你没有。 您可能有一个ServerSocketChannel
侦听来自多个客户端的连接 ,但是一旦您拥有一个已接受的SocketChannel
,它就只连接到一个客户端。 您可以从中获得所有来自该客户端的顺序请求。
它将每个请求存储在请求队列中。
我认为没有必要。
还有
socketChannel.configureBlocking(false)
然后我希望多个线程一次从请求队列中获取一个请求并写入
socketChannel
为什么不在阅读后立即计算回复并直接写回来?
我从文档中读到了以下内容。
套接字通道可以安全地由多个并发线程使用。 它们支持并发读写,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。
由于只能写入1个线程,在多次写入的情况下我该怎么办?
什么多次写? 每个频道只有一个客户端请求。 您只需要为每个请求写一个响应。 在您编写先前的响应之前,您不应该阅读,更不用说处理新的请求了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.