NioEventLoop执行nioEventLoop在线程被首次创建的时候会通过run方法执行 (SingleThreadEventExecutor.this.run()).Netty基本组件那次的笔记里有涉及到.
NioEventLoop.run()1234567run() -> for(;;) | select()[检查是否有io事件] | processSelectKeys()[处理io事件] | runAllTask()[处理异步任务队列,就是上一节最后说的taskQueue]
实际代码io.netty.channel.nio.NioEventLoop#run
123456789101112131415161718192021222324252627282930313233@Overrideprotected void run() { for (;;) { switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { case SelectStrategy.CONTINUE: con...
默认情况下,Netty服务端起多少线程?何时启动?
Netty是如何解决jdk空轮询bug的?
netty如何保证异步串行无锁化?
NioEventLoop
NioEventLoop创建
NioEventLoop启动
NioEventLoop执行逻辑
NioEventLoop创建1234567new NioEventLoopGroup()[线程数,默认2*cpu] | new ThreadPerTaskExecutor()[线程创建器] | for{newChlid()}[构造NioEventLoop] | chooserFactory.newChooser()[线程选择器]
跟踪new NioEventLoopGroup()
12345678910111213141516171819202122232425262728293031 public NioEventLoopGroup(int nThreads, Executor executor) { this(nThreads, executor, SelectorProvider.provider());//加入selector }--- ...
一个简单的netty服务端12345678910111213141516171819202122232425262728293031public final class Server { public static void main(String[] args) throws Exception { //两种类型的event loop EventLoopGroup bossGroup = new NioEventLoopGroup(1); //对应com.imooc.netty.ch2.Server.start,新连接 EventLoopGroup workerGroup = new NioEventLoopGroup(); //对应com.imooc.netty.ch2.Client.start,对连接进行逻辑操作 try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup)//配置两种event loop .channel(NioServerSocketChannel.class)//设置服务端的channel .childOption(ChannelOption.TCP_NODELAY, true)//给每个连接设置TC...
Netty基本组件netty中于对于原始socket相对应的概念
NioEventLoop(Nio事件循环)
监听以下两种
新连接的接入
数据的读写
Channel
表示连接。对应于在IO中的Socket,NIO中则是SocketChannel。实际上就是Socket的抽象。
ByteBuf
封装了一些接受发送数据的API
ChannelHandler
对二进制协议进行数据包的拆分,转换为Java类型等,服务端对数据的逻辑。
PipeLine
逻ࣹ...
索引基础在MySQL中,存储引擎用一本书的“索引”找到对应页码类似的方法。使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。
比如:
1SELECT first_name FROM sakila.actor WHERE actor_id = 5;
此时现在索引上按值进行查找,然后返回所有包含该值的数据行。
索引可以包含一个或多个列的值。...
锁读锁和写锁同时读是没有问题的,但是进行写的时候不能去读。实现由两种类型的锁组成的锁系统来解决问题:
读锁(共享锁):互不阻塞,可以同时读
写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
MySQL默认实现了这些。大多数时候,MySQL锁的内部管理都是透٠...
MySQL数据类型该如何选择数据类型?
更小的通常更好:一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和cpu缓存,并且处理时需要的cpu周期也更少。
简单就好:简单数据类型的操作通常需要更少的cpu周期,例如整型...
JVM知识点合集大纲
目录
1.类的加载机制
2.内存结构
3.GC算法
4.Class文件结构
document.querySelectorAll('.github-emoji')
.forEach(el => {
if (!el.dataset.src) { return; }
const img = document.createElement('img');
img.style = 'display:none !important;';
img.src = el.dataset.src;
img.addEventListener('error', () => {
img.remove();
el.style.color = 'inherit';
el.style.backgroundImage = 'none';
el.style.background = 'none';
});
img.addEventListener('load', () => {
img.remove();
});
document.body.appendChild(img);
});
Class类文件的结构Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表
无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编...
能被回收的对象对象存活判断当一个对象不再被引用时说明一个对象已经死了。怎样知道某个对象是活着还是死了。两种方法:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问...