【问题标题】:How to read SocketChannel in one thread, and write from n threads?如何在一个线程中读取 SocketChannel,并从 n 个线程中写入?
【发布时间】:2017-10-22 13:08:10
【问题描述】:

我有一个socketChannel (java.nio.channels.SocketChannel) 监听读取请求(来自多个客户端)。它将每个请求存储在 Request Queue 中。

还有socketChannel.configureBlocking(false)

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

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

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

由于只能写1个线程,多写的情况下怎么办?

【问题讨论】:

    标签: java multithreading sockets nio


    【解决方案1】:

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

    写入的问题是您一次只能以原子方式写入一个字节,如果您写入多个字节,您可能会发送一些但不是全部数据,在这种情况下,另一个线程可以尝试写入它的消息并且您收到一条损坏的消息。

    【讨论】:

    • 但是我需要能够处理来自多个线程的请求,而不仅仅是一个。
    • @M.Liu 在这种情况下,我建议你使用锁或队列。
    【解决方案2】:

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

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

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

    我认为没有必要。

    还有socketChannel.configureBlocking(false)

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

    为什么不一读就计算回复,然后直接写回来?

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

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

    由于只能写1个线程,多写的情况下怎么办?

    什么是多次写入?每个通道只有一个客户端请求。您只需为每个请求写一个回复。在写好之前的响应之前,您不应该阅读,更不用说处理新的请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多