我正在用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
}
}
如果我需要允许多个线程分派传入的消息,应该如何更改这个类?
谢谢!
答案 0 :(得分:2)
我非常喜欢this Doug Lee presentation关于设计基于Java NIO的可扩展系统。
从本质上讲,您的设计通常基于Reactor pattern,即单个I / O线程在多个客户端连接上循环。如果I / O线程变得饱和,您可以考虑从主反应堆连接到一个或多个子反应堆;每个反应堆都有自己的螺纹。
您的设计中需要注意的另一个重点是I / O线程应该只执行I / O ,并且通常应该将任何入站消息分发到单独的线程(例如ExecutorService
)做任何实际的工作。这可以防止在处理给定消息时其他连接缺少I / O.
答案 1 :(得分:1)
编写一个管理TcpLink类列表的包装类会更好。包装器类的作用是接收传入消息并将其分配给waiting / feww TcpLink实例,您可以计算吞吐量/ TPS并在需要时创建新实例。现在你只创建其中一个,这样它就是一个单独的。