文章目錄
- 一、EventLoop
- 1、EventLoop
- 2、EventLoopGroup
- (1)處理普通時間和定時任務
- (2)處理IO任務
- 二、Channel
- 三、Future&Promise
- 四、Handler&Pipeline
- 五、ByteBuf
一、EventLoop
1、EventLoop
EventLoop本質是一個單線程執行器(同時維護了一個Selector),里面有run方法處理Channel上源源不斷地IO事件。
它的繼承關系比較復雜:
- 繼承自j.u.c.ScheduledExecutorService因此包含了線程池中所有的方法。
- 另一條線是繼承自netty自己的OrderedEventExecutor。
package io.netty.channel;import io.netty.util.concurrent.OrderedEventExecutor;public interface EventLoop extends OrderedEventExecutor, EventLoopGroup {EventLoopGroup parent();
}
2、EventLoopGroup
EventLoopGroup是一組EventLoop,Channel一般會調用EventLoopGroup的register方法來綁定其中一個EventLoop,后續這個Channel上的IO事件都由此EventLoop來處理(保證了IO事件處理時的線程安全)。繼承自netty自己的EventLoopGroup:
- 實現了Iterable接口提供遍歷EventLoop的能力。
- 另外提供了next方法獲取集合中下一個EventLoop。
(1)處理普通時間和定時任務
package cn.itcast.netty.c3;import io.netty.channel.DefaultEventLoopGroup;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.NettyRuntime;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;@Slf4j
public class TestEventLoop {public static void main(String[] args) {// 1. 創建事件循環組EventLoopGroup group = new NioEventLoopGroup(2); // io 事件,普通任務,定時任務
// EventLoopGroup group = new DefaultEventLoopGroup(); // 普通任務,定時任務// 2. 獲取下一個事件循環對象System.out.println(group.next());System.out.println(group.next());System.out.println(group.next());System.out.println(group.next());// 3. 執行普通任務/*group.next().execute(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("ok");});*/// 4. 執行定時任務group.next().scheduleAtFixedRate(() -> {log.debug("ok");}, 0, 1, TimeUnit.SECONDS);log.debug("main");}
}