42、Nio(多线程优化(问题分析))

Nio(多线程优化(问题分析))

问题:我们的客户端发送了数据,但是客户端打印不了我们可读事件的内容(没有进入worker.select事件)

问题原因:selector的select方法上,以及sc的register方法

Select方法(事件)是在worker0线程里面执行,而我们register方法(注册)是在boss线程里执行的(他们在不同的线程里执行)但是他们都用的相同的selector(都是worker的selector(选择器))。他们会相互影响,这里只要select阻塞了,那么register就必须等待了(比如事件来了,select被唤醒worker0能运行了,然后boss这个线程才能运行)

逻辑:这里我们逻辑是前面我们先初始化selector,启动了worker0线程。所以这个selector的select先执行,然后才是下面的register的执行(前面被阻塞了,阻碍了这个方法)

改进逻辑:我们应该先给他在boss线程里面给他注册到selector,然后才能进行slector的select(前面我们先select结果没有事件来就seletor阻塞咯(用不了咯),那么下面的事件就注册不到我们的selector选择器了)

优化1、:我们将worker.register放到sc.register(这两个作用是不一样的,前面是来初始化并启动这worker线程(slelct方法),而后面的是一个将事件注册到selector)

这样他们这worker线程,和boss线程在同一时间start。进入就绪态,那么cpu调度这两个线程就不一定是worker先进入运行态咯

但是这样不行,这是一个客户端的偶然事件(boss在worker先进运行态了),但是若是多个客户端,我们第一运行后他一定是会阻塞到我们的selector的select方法上。那么下次的boss的register就一定在后面了

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127832591