我正在用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
}
}如果我需要允许多个线程分派传入的消息,这个类应该如何更改?
谢谢!
发布于 2010-01-22 01:32:35
在围绕Java NIO设计可伸缩系统方面,我真的很喜欢this Doug Lee presentation。
从本质上讲,您的设计通常基于Reactor pattern,即单个I/O线程在多个客户端连接上进行循环。如果I/O线程变得饱和,您可以考虑从主反应器到一个或多个子反应器的连接中断;每个反应器都包含自己的线程。
在您的设计中需要注意的另一个要点是,I/O线程应该只执行I/O,并且通常应该将任何入站消息分派到单独的线程(例如ExecutorService)来执行任何实际工作。这可以防止其他连接在处理给定消息时出现I/O匮乏。
发布于 2010-01-22 01:32:44
更好的做法是编写一个包装类来管理TcpLink类的列表。包装器类的作用是接收传入的消息,并将其分配给一个等待/少量TcpLink实例,您可以计算吞吐量/TPS,并在需要时创建新实例。现在,您将只创建其中的一个,这样它就是一个单独的thereaded。
https://stackoverflow.com/questions/2111307
复制相似问题