netty-FutureListener机制
当Future对象刚刚创建时,处于非完成状态,调用者可以通过返回的ChannelFuture来获取操作执行的状态,注册监听函数来执行完成后的操作
常用操作
- isDone:判断当前操作是否完成
- isSuccess:判断已完成的当前操作是否成功
- getCause:获取已完成的当前操作失败的原因
- isCancelled:判断已完成的当前操作是否被取消
- addListener:注册监听器,当操作已完成(isDone返回完成),将会通知指定的监听器;如果Future已完成,则通知指定的监听器
案例
NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
//创建服务器端的启动对象,配置启动参数
ServerBootstrap bootstrap = new ServerBootstrap();
//设置
bootstrap
.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true)
.childHandler(new ChannelInitializer<SocketChannel>() {
//给pipeline设置处理器
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline()
.addLast(new NettyServerHandler());//自定义处理器
}
});
System.out.println("服务器准备好了...");
//启动服务器, 绑定端口,并设置同步
ChannelFuture cf = bootstrap.bind(6668).sync();
//注册监听器,监控关心的事件
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (cf.isSuccess()){
System.out.println("监听端口6668成功");
}else {
System.out.println("监听端口6668失败");
}
}
});
//对关闭通道进行监听
cf.channel().closeFuture().sync();
//关闭
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
总结
相比传统阻塞io,执行io操作后线程会被阻塞住,直到操作完成;异步处理的好处是不会造成线程阻塞,线程在io操作期间可以执行别的程序,在高并发场景下吞吐量会更高