Selector处理accept和read事件

 作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题


代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等


联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等

前言

  • 多路复用

单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用

  • 多路复用仅针对网络 IO、普通文件 IO 没法利用多路复用

  • 如果不用 Selector 的非阻塞模式,线程大部分时间都在做无用功,而 Selector 能够保证

    • 有可连接事件时才去连接

    • 有可读事件才去读取

    • 有可写事件才去写入

      • 限于网络传输能力,Channel 未必时时可写,一旦 Channel 可写,会触发 Selector 的可写事件

一、处理accept事件

  • 服务器端代码
    import lombok.extern.slf4j.Slf4j;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.util.Iterator;
    
    /**
     * @author mx
     * @date 2022/6/2
     * @description Accept事件
     **/
    @Slf4j
    public class AcceptServer {
        public static void main(String[] args) throws IOException {
            //1.创建Selector,可以管理多个channel
            Selector selector = Selector.open();
    
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.configureBlocking(false);
    
            //2.建立channel和selector之间的联系(注册)
            //SelectionKey:事件发生后通过这个可以获取到相应事件,以及对应事件发生的channel
            SelectionKey sscKey = ssc.register(selector, 0, null);
            //表名这个key只关注accept事件
            sscKey.interestOps(SelectionKey.OP_ACCEPT);
            log.debug("register key:{}",sscKey);
            ssc.bind(new InetSocketAddress(8080));
    
            while (true){
                //3. selector.select()方法,没有事件就阻塞,有事件发送就恢复运行继续向下处理
                selector.select();
    
                //4.处理事件,selectionKeys内部包含了所有发生的事件
                Iterator<SelectionKey&
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值