【问题标题】:java - nio: send from different thread than selectingjava - nio:从不同的线程发送而不是选择
【发布时间】:2016-10-14 17:47:56
【问题描述】:

我经常听说,拥有一个负责与客户的所有通信的单一线程被认为是“好的设计”。

但是,现在我有多个线程与其他服务器通信以处理客户端请求。

当前设计会将响应排入队列以发送给选择线程。选择线程然后将响应出列并将它们发送到适当的客户端。

这太愚蠢了,imo。我有大约 30 个线程准备好向客户端发送响应,它们都将它们排入队列,并让一个选择线程一个接一个地发送它们。

假设一个封闭的系统,有没有办法安全地绕过这个限制并从一个没有(或者如果他没有相同的)选择器的线程作为最初接受客户端请求的线程发送?如果有,怎么做?

【问题讨论】:

  • 服务器通常在自己的线程中为每个客户端服务。如果您听到其他内容,那么我会认为这是错误的谣言。
  • @Heri 这不是谣言。显然,您从未对非阻塞多路复用 I/O 感到兴奋,这就是问题所在。它于 2002 年左右在 java.nio 包中被引入 Java 1.4,并且在 Unix 和 Windows 和其他操作系统中已经存在了几十年。不要在这里发布错误信息。

标签: java multithreading server nio throughput


【解决方案1】:

假设一个封闭的系统,有没有办法安全地绕过这个限制

没有这样的限制。您可以从任何您喜欢的线程发送。

并从一个与最初接受客户端请求的线程没有(或者如果他不一样)选择器的线程发送?如果有,怎么做?

只需致电SocketChannel.write()。唯一需要将写入排队到选择器线程的情况是,如果您获得短或零长度写入,在这种情况下,通道需要注册 OP_WRITE、排队的数据等。

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 2018-08-06
    • 2021-09-04
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多