繁体   English   中英

如何在一个线程中读取SocketChannel,并从n个线程写入?

[英]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个线程,在多次写入的情况下我该怎么办?

您可以使用自己的锁synchronizedReentrantLock ,或者对消息进行排队,让一个线程执行实际写入。

写入的问题是你一次只能原子地写一个字节,如果你写了多个字节,你可能会发送一些但不是所有数据,在这种情况下,另一个线程可以尝试写入它的消息,你得到一个损坏的消息。

我有一个java.nio.channels.SocketChannel侦听读取请求(来自多个客户端)。

不,你没有。 您可能有一个ServerSocketChannel 侦听来自多个客户端的连接 ,但是一旦您拥有一个已接受的SocketChannel ,它就只连接到一个客户端。 您可以从中获得所有来自该客户端的顺序请求。

它将每个请求存储在请求队列中。

我认为没有必要。

还有socketChannel.configureBlocking(false)

然后我希望多个线程一次从请求队列中获取一个请求并写入socketChannel

为什么不在阅读后立即计算回复并直接写回来?

我从文档中读到了以下内容。

套接字通道可以安全地由多个并发线程使用。 它们支持并发读写,但最多只有一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。

由于只能写入1个线程,在多次写入的情况下我该怎么办?

什么多次写? 每个频道只有一个客户端请求。 您只需要为每个请求写一个响应。 在您编写先前的响应之前,您不应该阅读,更不用说处理新的请求了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM