@1: 微任务和宏任务
什么是宏任务、微任务
先来了通俗易懂的例子:
去银行办理业务的人就是一个个宏任务,当宏任务P1在柜台办理业务时,其它任务都需等待,当一个宏任务P1办理业务结束时,柜台职员会询问他还有没有其它微任务,如果他还有其他业务,则其他宏任务都需等待。就是微任务是在宏任务之前执行。
宏任务、微任务有哪些
宏任务包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。
微任务包括: Promises, Object.observe, MutationObserver
宏任务、微任务的执行顺序
执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。
例子
setTimeout(function(){
console.log('1');
});
new Promise(function(resolve){
console.log('2');
resolve();
}).then(function(){
console.log('3');
});
console.log('4');
解析:
遇到setTimout,异步宏任务,放入宏任务队列中;
遇到new Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2;
而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中
遇到同步任务console.log(‘4’);输出4;主线程中同步任务执行完
从微任务队列中取出任务到主线程中,输出3,微任务队列为空
从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空,结束~
控制台测试一下,输出2 4 3 1;符合预期
@2:EventLoop
1:EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。
2:EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个 EventLoop来处理任务。在 Netty 服务器端编程中,我们一般都需要提供两个 EventLoopGroup,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。
3: 通常一个服务端口即一个 ServerSocketChannel对应一个Selector 和一个EventLoop线程。BossEventLoop 负责接收客户端的连接并将 SocketChannel 交给 WorkerEventLoopGroup 来进行 IO 处理,如下图所示
约定俗成的关系(非常重要):
1一个EventLoopGroup包含一个或多个EventLoop
2一个EventLoop在其生命周期内只能和一个Thread绑定
3所有I/O操作和事件都分配给EventLoop绑定的Thread处理
4一个Channel在其生命周期内,只能注册于一个EventLoop
5一个EventLoop可能被分配处理多个Channel。也就是EventLoop与Channel是1:n的关系
6一个Channel上的所有ChannelHandler的事件由绑定的EventLoop中的I/O线程处理
7不要阻塞Channel的I/O线程,可能会影响该EventLoop中其他Channel事件处理
8EventLoop接口中只定义一个方法: parent() ----- 用于返回当前EventLoop实现的实例所属的EventLoopGroup的引用