1

我正在用 Java 编写一个 Stomp 协议客户端,它只有一个线程来处理 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
         }
   }

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

谢谢!

4

2 回答 2

2

我真的很喜欢Doug Lee关于设计基于 Java NIO 的可扩展系统的演讲。

本质上,您的设计通常基于Reactor 模式,其中单个 I/O 线程在多个客户端连接上循环。如果 I/O 线程变得饱和,您可以考虑关闭从主反应器到一个或多个子反应器的连接;每个反应器都包含自己的线程。

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

于 2010-01-21T17:32:35.410 回答
1

编写一个管理 TcpLink 类列表的包装类将是一个更好的主意。包装类的角色将接收传入的消息并将其分配给等待/少数 TcpLink 实例,您可以计算吞吐量/TPS 并在需要时创建新实例。现在,您将只创建其中一个,以便它是单读的。

于 2010-01-21T17:32:44.137 回答