Selector的wakeup()
版权声明:本文为CSDN博主「木易九日111」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44601714/article/details/100081131
/*** Causes the first selection operation that has not yet returned to return* immediately.** <p> If another thread is currently blocked in an invocation of the* {@link #select()} or {@link #select(long)} methods then that invocation* will return immediately. If no selection operation is currently in* progress then the next invocation of one of these methods will return* immediately unless the {@link #selectNow()} method is invoked in the* meantime. In any case the value returned by that invocation may be* non-zero. Subsequent invocations of the {@link #select()} or {@link* #select(long)} methods will block as usual unless this method is invoked* again in the meantime.** <p> Invoking this method more than once between two successive selection* operations has the same effect as invoking it just once. </p>** @return This selector*/翻译一下,就是说其他线程如果因为调用了selector.select()或者selector.select(long)这两个方法而阻塞,
调用了selector.wakeup()之后,就会立即返回结果,并且返回的值!=0,
如果当前Selector没有阻塞在select方法上,
那么本次 wakeup调用会在下一次select阻塞的时候生效。
public abstract Selector wakeup();
也就是说,这个方法是用来唤醒阻塞的select()方法的
我们知道select()方法会阻塞,是因为用户态将socket的文件描述符和感兴趣的事件传递给操作系统底层的pipe,底层函数执行完成,触发事件之后底层就会向用户态返回数据,这样才会打破阻塞,
wakeup是如何唤醒阻塞的select()呢,我们从源码角度来看
public Selector wakeup() {synchronized(this.interruptLock) {if (!this.interruptTriggered) {this.setWakeupSocket();this.interruptTriggered = true;}return this;}
}
//这里追到了naive方法
private native void setWakeupSocket0(int var1);
setWakeupSocket()方法 会直接向pipe中添加wakeupSinkFD,这个FD会立即执行完成并且返回数据,这样底层就会给用户态数据,然后结束阻塞
Selector的wakeup()相关推荐
- Selector#wakeup()
看thrift源码发现selector.wakeup()方法,通常在selector.select()后线程会阻塞.使用wakeup()方法,线程会立即返回.源码分析应该是用的线程中断实现的.下面是个 ...
- Java NIO系列教程(六) Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...
- Java NIO——Selector机制源码分析---转
一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java Oper ...
- Java NIO类库Selector机制解析--转
一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...
- Java NIO学习系列三:Selector
前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...
- nio的epoll和selector实现流程分析
一.NETTY底层使用的是NIO的selector和epoll进行实现的,select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个 ...
- 完全理解NIO Selector
一.Selector是什么 Selector是一个或多个SelectableChannel对象的多路复用器. 二.如何创建一个Selector对象 一个selector对象可以通过调用Selector ...
- 高并发核心Selector详解
Selector设计 笔者下载得是openjdk8的源码, 画出类图 比较清晰得看到,openjdk中Selector的实现是SelectorImpl,然后SelectorImpl又将职责委托给了具体 ...
- Selector 实现原理
转载自 Selector 实现原理 概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代 ...
最新文章
- SAP S/4HANA销售订单创建时,会自动触发生产订单的创建
- memset汇编实现,跟踪得到的
- php var_dump和var_export区别
- android root 技术,android root实践
- foxmail6.5+易邮邮件服务器搭建局域网邮件收发系统(完整版包含测试)
- 使用Fresco加载gif动画
- python继承封装多态简单理解_Python面向对象编程:封装、继承、多态(基础篇十)...
- 读书笔记--正面管教
- Android AppWidget控制手机上网APN接入点
- 电磁兼容试验和测量技术标准 GB 17626 简介
- 小红书笔记怎么写提高转化率
- 联想YOGA 3笔记本如何U盘启动
- something about mantis
- python scrapy 管道学习,并拿在行练手爬虫项目
- Oracle函数——比较函数
- 添加自定义MIB的三种方法
- 【Python 3.7】喜欢的数字:使用一个字典来存储一些人喜欢的数字。
- 西工大计算机夏令营面试
- HEVC 序列参数集 SPS说明
- python 按照顺序读取文件夹中的图片名称