Reactor模式是把一个完整的IO操作分成几部分来进行,使用一个或多个Reactor来处理IO请求,对于具体的IO读写以及数据读取完成后的操作,分成更细粒度的模块,根据具体的需求和模块的耗时,来选择性使用单线程或是多线程或者线程池来完成整个IO操作。

来看具体的例子:
Reactor简单例子_晏无心_新浪博客
Reactor简单例子_晏无心_新浪博客

Reactor简单例子_晏无心_新浪博客
Reactor实现了Runnable接口,为多线程做准备(实际应用中未必要使用多线程,很多时候使用单线程);
注册accpet事件;
设置通道为非阻塞。

Reactor简单例子_晏无心_新浪博客
Reactor简单例子_晏无心_新浪博客
这里的while (true)和单线程的IO多路复用一致,不同的是在dispatch分发这里,这里可以选择单线程继续执行,也可以使用多线程执行,根据IO操作的耗时来决定。

这里的key.attachment()第一次是在Reactor初始化时设置的:
Reactor简单例子_晏无心_新浪博客
attach了一个Acceptor对象。

接下来来看Acceptor:
Reactor简单例子_晏无心_新浪博客
Acceptor同样实现了Runnable接口,为多线程做准备,根据实际需要来决定是否使用多线程。
Reactor简单例子_晏无心_新浪博客
在Acceptor里,对客户端连接的请求进行处理:
设置非阻塞模式;
注册读事件;
attach具体的处理handler。
selector.wakeup()针对多线程,唤醒selector.select()方法上阻塞的线程。
这里sk.attach(new Handler(sk, sc));后,会返回到Reactor的while(true)主循环里dispatch()方法进行处理:
Reactor简单例子_晏无心_新浪博客

最后来看具体的处理Handler:
Reactor简单例子_晏无心_新浪博客
Handler同样实现Runnable接口,为多线程做准备。
添加一个state变量,用来区分 读/写 操作。
Reactor简单例子_晏无心_新浪博客
Reactor简单例子_晏无心_新浪博客

Reactor简单例子_晏无心_新浪博客
在Handler里进行具体的IO读写并且对 读/写 监听事件进行切换。



相关文章:

  • 2022-12-23
  • 2021-12-14
  • 2022-12-23
  • 2021-04-02
  • 2021-04-29
  • 2021-10-18
  • 2021-09-26
  • 2021-06-20
猜你喜欢
  • 2021-10-19
  • 2021-06-03
  • 2021-07-22
  • 2022-12-23
  • 2021-12-26
  • 2021-05-21
  • 2021-11-17
相关资源
相似解决方案