eventloop
本质上是一个单线程执行器「同时维护了一个 selector
」,里面有 run
方法处理 channel
上源源不断的 IO
事件。
eventloopgroup
是一组 eventloop
,channel
一般会调用 eventloopgroup
的 reginster
方法来绑定其中一个 eventloop
,后续这个 channel
上的 IO
事件就由此 eventloop
来处理了。
方法简介
初始化
1 2 3 4
| EventLoopGroup eventLoopGroup = new NioEventLoopGroup(2);
|
参数可以指定默认线程数,如果不指定,就是线程数 * 2
next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package com.redisc;
import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.string.StringDecoder;
import java.io.IOException;
public class Run {
public static void main(String[] args) throws IOException { EventLoopGroup eventLoopGroup = new NioEventLoopGroup(2);
System.out.println(eventLoopGroup.next()); System.out.println(eventLoopGroup.next()); System.out.println(eventLoopGroup.next());
}
}
|
输出
1 2 3
| io.netty.channel.nio.NioEventLoop@d7b1517 io.netty.channel.nio.NioEventLoop@16c0663d io.netty.channel.nio.NioEventLoop@d7b1517
|
可以看到第一个输出和第三个输出的地址是一样的,这是因为,我们就弄了 2
个线程。
执行
普通任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package com.redisc;
import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import java.io.IOException;
public class Run {
public static void main(String[] args) throws IOException {
EventLoopGroup eventLoopGroup = new NioEventLoopGroup(2);
eventLoopGroup.next().execute(() -> { System.out.println(123); }); }
}
|
定时任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.redisc;
import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import java.io.IOException; import java.util.concurrent.TimeUnit;
public class Run {
public static void main(String[] args) throws IOException { EventLoopGroup eventLoopGroup = new NioEventLoopGroup(2);
eventLoopGroup.next().scheduleAtFixedRate(() -> { System.out.println(1); }, 0, 1, TimeUnit.SECONDS); }
}
|