2010-01-21 59 views
1

我正在用Java编写一个Stomp协议客户端,它只有一个线程来处理IO。这意味着线程将来回读取和写入数据到应用程序。我的问题是,如果我需要通过多线程和NIO来扩展此应用程序,那么可以如何安排?如何扩展这个单线程java客户端?

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

class TcpLink implements Runnable { 

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

如果我需要让多个线程分派收到的消息,如何类应该改变?

谢谢!

+0

这是客户端还是服务器? – danben 2010-01-21 17:28:30

+0

这是客户端。 – 2010-01-22 04:00:15

回答

2

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

实质上,您的设计通常基于Reactor pattern,其中单个I/O线程绕过许多客户端连接。如果I/O线程饱和,可以考虑将主反应堆与一个或多个儿童反应堆连接起来;每个反应器都含有自己的螺纹。

另外重要的一点在设计中要注意的是,I/O线程只能执行I/O和通常应派遣任何入站邮件到一个单独的线程(例如,ExecutorService)做任何实际工作。这可以防止在给定消息正在处理时其他连接不需要I/O。

+0

在此先感谢亚当斯分享这样一个良好的演示文稿和你的知识... – 2010-01-22 03:47:17

1

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

+0

非常感谢您的答案Teja ... 我认为你的意思是某种线程池,是不是?所以我可以使用ExecutorService或其他类型的工具来实现这一点。 – 2010-01-22 03:50:09