首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Netty Review - 探究Netty服务端主程序无异常退出的背后机制

这是因为Netty采用了异步的事件驱动模型,调用bind方法时,实际是注册了一个事件监听器,在后续端口绑定完成时会通过NioEventLoop线程执行相应的逻辑。...这样做的好处是可以避免阻塞调用方的线程,提高了程序的并发性能。 逻辑分析 我们知道: 端口绑定操作执行完成之后,main函数就不会阻塞,如果后续没有同步代码,main线程就会退出。...监听NioServerSocketChannel的关闭事件并同步阻塞main函数: // 监听NioServerSocketChannel的关闭事件并同步阻塞main函数 channelFuture.channel...同步阻塞等待服务端端口关闭 释放 I/0 线程资源和句柄等 调用线程被释放。...正确用法:服务端启动之后注册监听器监听服务端句柄关闭事件,待服务端关闭之后 异步调用 shutdownGracefull释放资源,这样调用线程就可以快速返回,不会阻塞

6400

【Netty】Netty 异步任务模型 及 Future-Listener 机制

异步操作概念 : 调用调用一个异步操作后 , 并不能马上知道该操作的返回值 , 该操作也不会马上执行完成 , 该操作完成后 , 会通过回调机制 , 如 通知 , 注册的回调函数等机制通知调用者 ; 2...是异步 IO 操作的返回结果 ; ③ 服务器端绑定端口号时 , 调用 Bootstrap 的 bind 方法 , 会返回 ChannelFuture 对象 ; ④ 客户端调用 Bootstrap...future) throws Exception 接口实现方法 ; ④ IO 操作执行状态判定 : operationComplete 方法中通过 调用 ChannelFuture future...IO 操作的同步与异步 : ① 同步 IO 操作 : BIO 中的同步 IO 操作 , 会阻塞当前的线程 , IO 操作返回前 , 处于阻塞状态 , 不能执行其它操作 ; ② 异步 IO 操作 : 异步...IO 操作不会阻塞当前的线程 , 调用 IO 操作之后 , 可以立即执行其它操作 , 不会阻塞当前线程 , 该机制非常适用于高并发的场景 , 开发稳定 , 并发 , 高吞吐量 的服务器 ; 3 .

1.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

【Flink】第三十一篇:Netty 之 核心设计、核心抽象和线程模型

本篇将介绍Netty的 设计思想 核心抽象 IO线程模型等 在上一篇中,我们介绍了BIO阶段,IO由单线程演进到多线程,但本质都是阻塞的socket模式, 单线程: 这段代码片段将只能同时处理一个连接...多线程: Java NIO: Java NIO 很早就提供了非阻塞调用,可以使用操作系统的事件通知API注册一组非阻塞套接字,以确定它们中是否有任何的套接字已经有数据可供读写。...阐述: 主调线程执行非阻塞方法,方法立即返回一个Future。然后在这个Futrue注册一个Listener。主调线程便可以继续执行其他事情了。...迅速返回调用者控制权:operationComplete(Future)会直接被一个IO线程调用。因此,IO期间,执行一个耗时的或者阻塞的operationComplete会发生意料之外的事情。...这也就解释了任何的Thread 是如何与Channel 直接交互而无需ChannelHandler 中进行额外同步的。

78930

【Netty】「萌新入门」(三)强大的连接管理和关闭处理:ChannelFuture 和 CloseFuture 解析

例如,写入数据到 Channel 时,调用 write() 方法将立即返回一个 ChannelFuture 对象,而不是等待数据实际被写入。...sync sync() 方法是 ChannelFuture 接口中的一个同步方法,它将阻塞当前线程,直到这个 ChannelFuture 执行完毕。...调用 sync() 将会阻塞当前线程,等待异步操作完成并获取其结果。...但是需要注意的是,由于 sync() 方法会阻塞当前线程,因此应该尽可能地避免 I/O 线程调用 sync() 方法,以免影响整个系统的性能表现。...input 线程运行过程中并没有阻塞线程,因此,主线程就会继续向下运行,造成了上面的情况; 那如果将 “处理 channel 关闭之后的操作” 移动到 channel.close(); 后面是不是就可以了呢

75130

【Netty】「源码解析」(三)设置连接超时:深入分析 ChannelFuture.sync() 的执行过程 | 技术创作特训营第一期

() 执行过程解析 下面是 ChannelFuture.sync() 方法的执行过程: 调用 ChannelFuture.sync() 方法将当前线程阻塞,直到对应的操作完成或发生异常。...图片 需要注意的是,由于 ChannelFuture.sync() 是一个同步阻塞方法,如果在事件循环线程调用该方法,可能会导致死锁或性能问题。...然后父类的 sync() 方法中,调用 await() 和 rethrowIfFailed() 来实现同步等待和异常检查,并返回当前对象。...代码块,使用当前对象作为同步锁,确保线程环境下只有一个线程可以进入代码块。其中,该代码块核心为当承诺未完成时,一直执行循环。...循环内部,调用 incWaiters() 方法增加等待中的线程计数器。

4.3K37332

netty源码解析

阻塞阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待(非阻塞的特点就是不需要自己操作io,由内核自动完成) 银行里取款办业务时,领取一张小票,领取完后我们自己可以玩玩手机...bio(同步阻塞IO) 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。...nio(同步阻塞/异步阻塞IO) 同步阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。...因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。...,并在线程内部执行NioEventLoop类的run方法,该线程不会立马开始执行。

43620

高性能通讯框架——Netty

Java中支持的3种网络编程模型/IO模式 BIO同步阻塞 服务器实现模式为一个连接一个线程,即客户端有连接请求时服务端就需要启动一个线程进行处理。...NIO同步阻塞 服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器,多路复用器轮询到连接有I/O请求就进行处理。...NIO工作模式——非阻塞模式: Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能获得目前可用的数据,如果目前没有数据可用,就什么都不会获取,而不是保持线程阻塞。...()让主线程同步等待子线程结果 channelFuture.channel().closeFuture().sync(); log.info("TCP服务已关闭...对象,它用来进来异步通知 // 一般Socket编程中,等待响应结果都是同步阻塞的,而Netty则不会造成阻塞,因为ChannelFuture是采取类似观察者模式的形式进行获取结果

55520

【Netty】「源码解析」(三)设置连接超时:深入分析 ChannelFuture.sync() 的执行过程

() 执行过程解析 下面是 ChannelFuture.sync() 方法的执行过程: 调用 ChannelFuture.sync() 方法将当前线程阻塞,直到对应的操作完成或发生异常。...需要注意的是,由于 ChannelFuture.sync() 是一个同步阻塞方法,如果在事件循环线程调用该方法,可能会导致死锁或性能问题。...然后父类的 sync() 方法中,调用 await() 和 rethrowIfFailed() 来实现同步等待和异常检查,并返回当前对象。...代码块,使用当前对象作为同步锁,确保线程环境下只有一个线程可以进入代码块。其中,该代码块核心为当承诺未完成时,一直执行循环。...循环内部,调用 incWaiters() 方法增加等待中的线程计数器。

41020

【Netty】Netty 核心组件 ( Future | Channel | Selector | ChannelHandler )

异步操作 : 这些 IO 操作都是异步的 , 调用相应的 IO 方法后 , 相应的操作异步执行 , 调用 IO 方法的代码位置不产生阻塞 ; 3 ....等待异步操作完成 : 调用 ChannelFuture 对象的 sync 方法 , 可以等待该异步操作完成后 , 执行之后的操作 , 相当于将异步操作变成了同步操作 ; // 绑定本地端口, 进行同步操作...常用的 Channel 组件类型 : 可以根据 协议 , 阻塞类型 , 选择合适的 Channel 组件 ; Channel 通道组件类型 协议类型 阻塞类型 ( 同步 / 异步 ) 位置 ( 服务器...绑定本地端口, 进行同步操作 , 并返回 ChannelFuture ChannelFuture channelFuture = bootstrap.bind(8888).sync(); // 2....: 选择器 Selector NioEventLoopGroup 线程池中的 NioEventLoop 线程中维护 ; ③ 单线程监听多通道 : 借助 Selector 选择器 , 可以实现 一个

1.4K11

Netty 系列一(核心组件和实例).

这将导致一系列的问题,第一,在任何时候都可能有大量的线程处于休眠状态(不可能每时每刻都有对应的并发数);第二,需要为每个线程调用栈都分配内存;第三,JVM 在线程的上下文切换所带来的开销会带来麻烦。...因为一个操作可能不会立即返回,所以我们需要一种之后的某个时间点确定其结果的方法。     Future 和 回调 是相互补充的机制,提供了另一种操作完成时通知应用程序的方式。...EventLoop本身只由一个线程驱动,其处理了一个Channel的所有I/O事件,并且该EventLoop的整个生命周期内都不会改变。...这个简单而强大的设计消除了你可能有的ChannelHandler实现中需要进行同步的任何顾虑。     这里需要说到,EventLoop的管理是通过EventLoopGroup来实现的。...()); //7、获取 Channel 的 CloseFuture,并且阻塞当前线程直到它完成 channelFuture.channel().closeFuture

47030

Netty系列--简介

从编程语言层面 BIO | NIO | AIO 以Java的角度,理解如下: BIO,同步阻塞式IO,简单理解:一个线程处理一个连接,发起和处理IO请求都是同步的。...NIO,同步阻塞IO, 简单理解:一个线程处理多个连接,发起IO请求是非阻塞的但处理IO请求是同步的 AIO,异步非阻塞IO,简单理解:一个有效请求一个线程,发起和处理IO请求都是异步的 NIO的优势不在于速度...channelFuture = serverBootstrap.bind().sync(); System.out.println("开始监听,端口为:" + channelFuture.channel...)//多线程处理 .channel(NioSocketChannel.class)//指定通道类型为NioServerSocketChannel,一种异步模式,OIO阻塞模式为...channelFuture = bootstrap.connect().sync(); channelFuture.channel().closeFuture().sync();

11820

Netty Review - 核心组件扫盲

一般Socket编程中,等待响应结果都是同步阻塞的,而Netty则不会造成阻塞,因为ChannelFuture是采取类似观察者模式的形式进行获取结果。...常用的就是这两个通道类型,因为是异步非阻塞的。所以是首选。 OioSocketChannel: 同步阻塞的客户端 TCP Socket 连接 (已废弃)。...OioServerSocketChannel: 同步阻塞的服务器端 TCP Socket 连接 (已废弃) 。...实际每一个channel都有一个处理器的流水线 Bootstrap中childHandler()方法需要初始化通道,实例化一个ChannelInitializer,这时候需要重写initChannel...一般情况下,都用不这个方法 bind() 提供用于服务端或者客户端绑定服务器地址和端口号,默认是异步启动。如果加上sync()方法则是同步。 有五个同名的重载方法,作用都是用于绑定地址端口号。

35340

Netty 源码解析 ——— 服务端启动流程 (下)

这意味着任何I/O的调用都会立即的返回,并且它不保证所请求的I/O操作调用之后会完成。相反,你会得到一个ChannelFuture的实例,它会向你返回一些关于I/O操作的结果或者状态的一些信息。...源码解析 ChannelFuture channelFuture = serverBootstrap.bind(5566) ? 创建一个新的Channel并且绑定到这个端口号。 最终会调用?...ADD_PENDING状态表示ChannelHandler.handlerAdded方法即将被调用,但当前并不会调用。    ...task提交至EventLoop的taskQueue中,EventLoop的事件循环会从taskQueue中将task取出,然后EventLoop线程执行该任务。...githubvalodzka提出了这么个意见:当前SelectorProvider.provider()(该方法包含了同步代码块)会在每一个channel被创建的时候调用

1.2K60

java使用netty的模型总结

1.先说下之前的bio-同步阻塞io ? 显然有点网络基础的人都写过类似的代码。优缺点很明显 缺点:性能瓶颈。每个链接一个线程,怎么保证线程的即时回收和可靠回收是一大技术问题。...所以我才说有点网络基础的人都写过类似的代码,,,除非直接起手springboot的 2.后面就是nio-同步阻塞io ?...BIO模型中,当读不到数据后会阻塞,而NIO中不会!所以需要自行进行处理!说到底就是自定义网络协议,额其实这个有点基础的都写过,我也不细说了。...4.Reactor多线程模型 ? reactor将接受发送分离,client发送的请求丢到线程池中,所以后续请求不会阻塞。 但是当用户进一步增加的时候,Reactor会出现瓶颈!...为了使用 Selector, 我们首先需要将 Channel 注册到 Selector 中, 随后调用 Selector 的 select()方法, 这个方法会阻塞, 直到注册 Selector 中的

56740

Netty网络编程第二卷

(new Runnable() { @Override public void run() { //下一个handler的调用新的线程环境中进行调用...方法一: 使用sync()方法 //2.1使用sync方法同步处理结果 //阻塞住当前线程,直到nio线程连接建立完毕 channelFuture.sync...executor的执行线程是同一个,即该线程的一个任务等待该线程的其他任务唤醒自己。...,认为只有 netty,nio 这样的多路复用 IO 模型时,读写才不会相互阻塞,才可以实现高效的双向通信,但实际,Java Socket 是全双工的:在任意时刻,线路上存在A 到 B 和 B 到...即使是阻塞 IO,读和写是可以同时进行的,只要分别采用读线程和写线程即可,读不会阻塞写、写也不会阻塞读 例如 public class TestServer { public static void

59520

Netty网络编程第六卷

,当前线程会被挂起,调用线程只有得到结果之后才会返回; 3)非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。...阻塞、非阻塞同步、异步的区别(阻塞、非阻塞同步、异步其实针对的对象是不一样的): 1)阻塞、非阻塞的讨论对象是调用者; 2)同步、异步的讨论对象是被调用者。...实际应用程序系统调用完成上面的 2 步操作时,调用方式的阻塞、非阻塞,操作系统处理应用程序请求时,处理方式的同步、异步处理的不同,可以分为 5 种 I/O 模型 I/O模型1:阻塞式 I/O 模型(...优点:程序简单,阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源。...4)调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture ,可以 I/O 操作成功、失败或取消时回调通知调用方。

32920

45 张图深度解析 Netty 架构与原理

1)BIO:同步的、阻塞式 IO。在这种模型中,服务器上一个线程处理一次连接,即客户端每发起一个请求,服务端都要开启一个线程专门处理该请求。...Java NIO 的非阻塞模式,使得一个线程从某个通道读取数据的时候,若当前有可用数据,则该线程进行处理,若当前无可用数据,则该线程不会保持阻塞等待状态,而是可以去处理其他工作(比如处理其他通道的读写)...本节最后,讨论一下网路 IO 中阻塞、非阻塞、异步、同步这几个术语的含义和关系: 阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,则调用 read/write...非阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,调用 read/write 过程的线程不会一直等待,而是去处理其他工作,等到 read/write...同步:read/write 过程由网络 IO 程序(其中的线程)来完成。 基于以上含义,可以看出:异步 IO 一定是非阻塞 IO;同步 IO 既可以是阻塞 IO、也可以是非阻塞 IO。 1.4.

15.3K1211
领券