Netty框架之多线程的Selector优化
学习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;

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

被折叠的 条评论
为什么被折叠?



