EventLoop和线程模型,在java concurrent线程池的基础上的封装。
java提供了executor,通过创建的线程缓存和重用Thread减少new thread 的资源消耗,减少线程上下文切换的消耗。
网络框架的基本功能:运行任务执行生命周期内的事件,Netty通过事件循环来处理这样的事件,netty concurrent的类结构:
在netty中,一个eventLoop由一个thread驱动,多个channel可以注册到一个channel中,一个eventLoop可以服务多个channel。
Netty4中的事件和I/O处理:
I/O事件将通过channel和pipeline进行流动,channelHandler拦截处理I/O事件。
Netty和java调度器:
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import io.netty.channel.Channel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.util.concurrent.ScheduledFuture;
public class ScheduleExample {
/**
* java 自带的调度器
*/
public static void schedule(){
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.schedule(new Runnable(){
public void run(){
}
}, 1000, TimeUnit.MILLISECONDS);
executor.shutdown();
}
/**
* netty带的调度器
*/
public static void scheduleEventLoop(){
Channel ch = new NioSocketChannel(); // get reference from somewhere
ScheduledFuture<?> future = ch.eventLoop().schedule(new Runnable(){
@Override
public void run(){
}
}, 1000, TimeUnit.MILLISECONDS);
future.cancel(true);
}
}
EventLoop线程的实现细节:
Netty尽量保证I/O为非阻塞,所以执行时间很长的runnable应该单独开启线程执行,而不放入EventLoop队列中中执行。
EventLoop线程的分配:
异步传输:
同步传输: