我正在用 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/