有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

主从Reactor多线程模式
在网络编程中,Reactor模式是一种事件处理的模式,用于处理服务端接收到的并发请求。一个Reactor对象会负责监听和分发事件,如IO事件。当一个请求到达后,Reactor就将其分发给相应的处理器。
在多线程环境下,主从Reactor多线程模式是一种常见的设计模式,用于提高网络程序的并发处理能力。这种模式通常包含一个主Reactor和多个从Reactor,每个Reactor都在自己的线程中运行。
主Reactor
主Reactor负责监听服务端的连接请求。它通常运行在单独的线程中,只处理客户端的连接事件。当有新的连接建立时,主Reactor将这个连接分配给一个从Reactor来处理后续的IO事件。
核心职责:
- 监听连接事件
- 接受客户端的连接
- 将新的连接分配给从Reactor
从Reactor
从Reactor负责处理已经建立的连接中的IO事件,如读取数据、写入数据等。每个从Reactor通常运行在自己的线程中,可以处理多个连接。这样可以将连接的IO处理分散到多个线程,提高处理效率。
核心职责:
- 处理IO事件(读/写)
- 执行非阻塞操作
- 将业务逻辑处理委托给工作线程(可选)
多线程优势
使用主从Reactor多线程模式的优势包括:
- 高效的连接管理:主Reactor专注于连接的接受,从而快速响应新的客户端连接。
- 负载分散:从Reactor分担了IO处理的负载,可以在多核CPU上更好地利用资源。
- 性能提升:多线程可以提高程序的吞吐量和响应时间。
示例代码
以下是一个简化的Java伪代码示例,展示了主从Reactor多线程模式的基本结构:
public class MainReactor implements Runnable {
// ... 省略其他代码 ...
public void run() {
while (!Thread.interrupted()) {
// 监听连接事件
SelectionKey key = // ... 获取连接事件 ...
if (key.isAcceptable()) {
// 接受连接
SocketChannel clientChannel = // ... 接受客户端连接 ...
// 将连接分配给从Reactor
dispatchToSubReactor(clientChannel);
}
}
}
private void dispatchToSubReactor(SocketChannel clientChannel) {
// ... 分配给从Reactor的逻辑 ...
}
}
public class SubReactor implements Runnable {
// ... 省略其他代码 ...
public void run() {
while (!Thread.interrupted()) {
// 处理IO事件
SelectionKey key = // ... 获取IO事件 ...
if (key.isReadable()) {
// 读取数据
// ...
} else if (key.isWritable()) {
// 写入数据
// ...
}
}
}
}
在实际应用中,主从Reactor多线程模式需要结合NIO(非阻塞IO)来实现,以确保系统的高性能和高吞吐量。Java NIO库提供了Selector、Channel等关键组件,使得实现这一模式成为可能。


