java - 如何扩展这个单线程 Java 客户端?

标签 java multithreading nio

我正在用 Java 编写一个 Stomp 协议(protocol)客户端,它只有一个线程来处理 IO。这意味着线程来回读取传入数据和将传入数据写入应用程序。我的问题是,如果我将来需要使用多线程和 NIO 扩展此应用程序,应该如何安排?

我的 IO 处理器线程称为“TcpLink”链接,它具有以下骨架

    class TcpLink implements Runnable {

         public void run() {
            // read data from socket and assign it to  a byte buffer
            // notify the listening application
         }
   }

如果我需要允许多个线程分派(dispatch)传入的消息,应该如何更改这个类?

谢谢!

最佳答案

我很喜欢this Doug Lee presentation关于设计基于 Java NIO 的可伸缩系统。

本质上,您的设计通常基于 Reactor pattern借此,单个 I/O 线程轮询多个客户端连接。如果 I/O 线程变得饱和,您可以考虑从一个主 react 器到一个或多个子 react 器的连接分流;每个 react 器都包含自己的线程。

在您的设计中需要注意的另一个重要点是 I/O 线程应该只执行 I/O 并且通常应该将任何入站消息分派(dispatch)到一个单独的线程(例如 ExecutorService) 来做任何实际的工作。这可以防止其他连接在处理给定消息时缺乏 I/O。

关于java - 如何扩展这个单线程 Java 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2111307/

相关文章:

java - 为什么我的 Spring webflux 应用程序在每个请求上都会生成临时文件?

java - 重复的局部变量 x

java - 使用 Eclipse 和 Tomcat 管理库

java - 第二个循环背后的逻辑

c++ - POSIX 线程在 C 中没有产生加速

multithreading - linux上的gcc相当于微软的关键部分是什么?

java - fork /加入 : Collecting results

java.nio.file.Path.contains(subPath)?

java - Spring组件类必须是线程安全的

JavaNIO 多线程服务器不工作