版权声明:本文为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()相关推荐

  1. Selector#wakeup()

    看thrift源码发现selector.wakeup()方法,通常在selector.select()后线程会阻塞.使用wakeup()方法,线程会立即返回.源码分析应该是用的线程中断实现的.下面是个 ...

  2. Java NIO系列教程(六) Selector

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...

  3. Java NIO——Selector机制源码分析---转

    一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java   Oper ...

  4. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  5. Java NIO学习系列三:Selector

    前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...

  6. nio的epoll和selector实现流程分析

    一.NETTY底层使用的是NIO的selector和epoll进行实现的,select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个 ...

  7. 完全理解NIO Selector

    一.Selector是什么 Selector是一个或多个SelectableChannel对象的多路复用器. 二.如何创建一个Selector对象 一个selector对象可以通过调用Selector ...

  8. 高并发核心Selector详解

    Selector设计 笔者下载得是openjdk8的源码, 画出类图 比较清晰得看到,openjdk中Selector的实现是SelectorImpl,然后SelectorImpl又将职责委托给了具体 ...

  9. Selector 实现原理

    转载自 Selector 实现原理 概述 Selector是NIO中实现I/O多路复用的关键类.Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的. Channel代 ...

最新文章

  1. SAP S/4HANA销售订单创建时,会自动触发生产订单的创建
  2. memset汇编实现,跟踪得到的
  3. php var_dump和var_export区别
  4. android root 技术,android root实践
  5. foxmail6.5+易邮邮件服务器搭建局域网邮件收发系统(完整版包含测试)
  6. 使用Fresco加载gif动画
  7. python继承封装多态简单理解_Python面向对象编程:封装、继承、多态(基础篇十)...
  8. 读书笔记--正面管教
  9. Android AppWidget控制手机上网APN接入点
  10. 电磁兼容试验和测量技术标准 GB 17626 简介
  11. 小红书笔记怎么写提高转化率
  12. 联想YOGA 3笔记本如何U盘启动
  13. something about mantis
  14. python scrapy 管道学习,并拿在行练手爬虫项目
  15. Oracle函数——比较函数
  16. 添加自定义MIB的三种方法
  17. 【Python 3.7】喜欢的数字:使用一个字典来存储一些人喜欢的数字。
  18. 西工大计算机夏令营面试
  19. HEVC 序列参数集 SPS说明
  20. python 按照顺序读取文件夹中的图片名称

热门文章

  1. 北京web前端培训哪里好,从0开始打造个人网站
  2. 红米3s微信无法连接到服务器,红米手机怎么更新不了微信8.0
  3. linux 脚本 中断,Shell脚本中断后进行运行
  4. linux USB千兆以太网卡配置及使用
  5. OPPO学小米推性价比手机,联发科要糟糕
  6. 肚子都笑疼的爆笑笑话有哪些?
  7. oracle中游标分类,Oracle 游标分类以及实例
  8. 饮料代理品牌的选择有多重要?新手应该如何选择?
  9. 【QML】实现一个炫酷小键盘
  10. 基于JAVA和SQL SERVER数据库实现个人财务管理系统