节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾

科创中国 admin 2019-07-12 313 次浏览 0个评论
网站分享代码

BIO

1.BIO即堵塞式IO,运用BIO模型,一般倩语倩寻会为每个Socket分配一个独立的线儿童智商测验程

  • 为了避节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾免频频创立和毁掉线程,能够选用线程池,但Socket和线程之间的对应联系不会发生变化

2.BIO适用于Socket衔接不是许多的场景,但现在上百万的衔接是很常见的,丁传红而创立上节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾百万个线程是不现实的

  • 因而BIO线程模型无法处理百万衔接的问题

3.在互联网场景中,衔接尽管许多,但每个衔接上的恳求并不频频,因而线程大部分时刻都在等候IO安排妥当

抱负的线程模型

1.用一个线程来处理多个衔接,能够进步线程的使用率,下降所需求的线程

2.运用BIO相关的API是无法完结的,BIO相关的Socket读写操作都是堵塞式的

  • 一旦调用了堵塞式的API,在IO安排妥当前,调用线程会一向堵塞,也就无法处理其他的Socket衔接

3.使用NIO相关的API能够完结一个线程处理多个衔接,经过Reactor形式完结

Reactor形式

1.Handle指的是IO句柄,在Java网络编程里,本质上是一个网络衔接

2.Event Handler是事情处理器,handle_event()处理IO事情,每个Event Handler处理一个IO Handle

  • get_handle()办法能够回来这个IO Handle
  1. Synchronous Event Demultiplexer相当于操作系统供给的IO多路复用API
  • 例如POSIX规范里的select()以及Linux里的epoll()

4.Reactor是Reactor形式的中心

  • register_handler()和rem咖啡豆ove_handler()能够注册和删去一个事情处理器
  • handle_events()是中心
  • 经过同节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾步事情多路选择器供给的select()办法监听网络事情
  • 当有网络事情安排妥当后,就遍历事情华夏收藏网处理器来处理该网络事情
void Reactor::handle_ev中国证监会ents(){
// 经过同步事情多路选择器供给的select()办法监听网络事情
select(handlers);
// 处理网络事情
for(h in handlers){
h.handle_event();
}
}
// 在主程序中发动事情循环
while (true) {
handle_events();
}

Netty的线程模型

1.Netty参阅了Reactor形式,Netty中最中心的概念是事情循环(EventLoop),即Reactor形式中的Reactor

  • 担任监听网络事情并调用事情处理器进行处理
  1. 在Netty 4.x中,网络衔接 : EventLoop : Java线程 = N:1:1
  • 所以,一个网络衔接只会对应到一个Java线程
  • 长处:关于一个网络衔接的事情处理都是单线程的,这样能防止各种并发问题

Ev乐平气候entLoopGroup

1.EventLoopGroup由一组EventLoop组成

  • 实际运用中,一般会创立两个EventLoopGroup,一个是bossGroup,一个是workerGroup

2.Socket处理TCP网络衔接恳求,是在一个独立的Socket中

  • 每逢有一个TCP衔接成功树立,都会创立一个新的Socket
  • 之后对TCP衔接的读写都是由新创立处理的Socket完结的
  • 处理TCP衔接恳求和读写恳求是经过两个不同的Socket完结的

3.在Netty中,bossGroup用来处理衔接恳求的,workerGroup用来处理读写恳求的

  • bossGroup处理完衔接恳求后,会将这个衔接提交给workerGroup来处理
  • workerGroup中会有多个EventLoop,经过均衡负载算法(轮询)来分配某一个EventLoop

Echo程序

public class Echo {
public static void睚眦必报 main(String[] args) {
// 事情处理器
EchoServerHandler serverHandler = new EchoServerHandler();
// boss线程组
EventLoopGroup bossGroup海思 = new NioEventLoopGroup(1);
// worker线程组
EventL节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾oopGroup workerGroup = new NioEventLoopGroup(1);
try {
ServerBootstrap boot迅雷看看播放器strap = new Serv肉奴erBootstrap();
bootstrap.group(bossGroup, 管中窥豹workerGroup)
.c韩雪老公hannel(NioServerSocketChannel.classdcs)
.childHa李左飞ndler(new C节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾hannelInitializer() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exce我的国际2ption {
socketChannel.pipeline().ah片ddLast(serverHandler);
}
});
// 绑定端口号
ChannelFuture future = bootstrap.bind(9090).sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 停止worker线程组
workerGroup.shut节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾downG节,Java并发——Netty线程模型-滁州团体活动列表,带您走出业余生活的雾霾racefully();
// 停止boss线程组
bossGroup.shutdownGracefully();
}
}
}
// Socket衔接处理器
class EchoServerHandler extends ChannelInboundHandlerAdapter {
// 处理读事情
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write(msg);
}
// 江雨瞳处理读完结事情
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}
// 处理反常事情
@Override
publ米饭ic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}

写在最终