Netty框架之多线程的Selector优化

本文介绍了使用Netty框架通过多线程和Selector优化服务器性能的方法。首先,通过一个Boss线程处理连接事件,一个Woker线程处理IO读写事件,实现服务器的基础架构。接着,进一步优化,将Woker线程数量增加,利用AtomicInteger进行负载均衡,分散IO读写事件,提升并发处理能力。这种方法充分利用了CPU资源,降低了单个Woker的压力。


学习Selector之后,我们发现单个Selector轮询器在一个线程中既要处理 连接事件(OP_ACCPET),又要处理 IO读写事件(OP_READ,OP_WRITE),效率是很低的,所以利用多线程创建多个Selector分别负责连接事件,IO读写事件,充分利用电脑的CPU资源.

那么这里我们就分类两个线程:
1.Boss线程:专门负责OP_ACCPET事件,也就是连接事件
2.Woker线程:专门负责OP_READ和OP_WRITE事件,也就是IO读写事件

在这里插入图片描述

1.一个Boss线程,一个Woker线程实现服务器

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 多线程结合selector优化,充分利用CPU资源
 * 一个boss线程,一个woker线程
 * boss专门负责处理连接请求,woker专门负责处理IO读写请求
 */
public class WokerTest {
   
   
    public static void main(String[] args) throws Exception {
   
   
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);

        Selector boss = Selector.open();
        ssc.bind(new InetSocketAddress(8080));
        SelectionKey ssck = ssc.register(boss, 0, null);
        //设置只关心连接事件
        ssck.interestOps(SelectionKey.OP_ACCEPT);
        Woker woker = new Woker("woker-0");
        //处理连接请求
        while(true){
   
   
            //如果有连接请求就处理连接,如果没有就阻塞
            boss.select();
            Iterator<SelectionKey> iterator = boss.selectedKeys().iterator();
            while(iterator.hasNext()){
   
   
                SelectionKey sk = iterator.next();
                SocketChannel sc =(SocketChannel)sk.channel();
                //设置为非阻塞模式
                sc.configureBlocking(false);
                //注册到woker中,让woker负责此通道的IO处理
                woker.registe(sc);
            }
        }
    }
    static class Woker implements Runnable{
   
   
        private String name;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值