Java NIO Selector(三)

Java NIO学习(三)Selector监听事件+NIO服务器实例 书接上文上一篇博客说了一下SelectionKey这个对象的一些常用属性,为这一篇文章的NIO服务器实例算是做了一些铺垫。不过在展示服务端实例代码之前,还要说几点细节上的东西。Selector如何选择就绪的通道//这个方法可能会阻塞,直到至少有一个已注册的事件发生,或者当一个或者更多的事件发生时 selector.select();NIO明明是非阻塞的IO,为何会阻塞这是第一章Java NIO学习( 阅读详情

通过Selector选择通道
一旦向Selector注册了一或多个通道,就可以调用几个重载的select()方法。这些方法返回你所感兴趣的事件(如连接、接受、读或写)已经准备就绪的那些通道。换句话说,如果你对“读就绪”的通道感兴趣,select()方法会返回读事件已经就绪的那些通道。
下面是select()方法:

int select()
int select(long timeout)
int selectNow()

select()阻塞到至少有一个通道在你注册的事件上就绪了。
select(long timeout)和select()一样,除了最长会阻塞timeout毫秒(参数)。
selectNow()不会阻塞,不管什么通道就绪都立刻返回(译者注:此方法执行非阻塞的选择操作。如果自从前一次选择操作后,没有通道变成可选择的,则此方法直接返回零。)。
select()方法返回的int值表示有多少通道已经就绪。亦即,自上次调用select()方法后有多少通道变成就绪状态。如果调用select()方法,因为有一个通道变成就绪状态,返回了1,若再次调用select()方法,如果另一个通道就绪了,它会再次返回1。如果对第一个就绪的channel没有做任何操作,现在就有两个就绪的通道,但在每次select()方法调用之间,只有一个通道就绪了。
selectedKeys()
一旦调用了select()方法,并且返回值表明有一个或更多个通道就绪了,然后可以通过调用selector的selectedKeys()方法,访问“已选择键集(selected key set)”中的就绪通道。如下所示:

Set selectedKeys = selector.selectedKeys();

当像Selector注册Channel时,Channel.register()方法会返回一个SelectionKey 对象。这个对象代表了注册到该Selector的通道。可以通过SelectionKey的selectedKeySet()方法访问这些对象。
可以遍历这个已选择的键集合来访问就绪的通道。如下:
 

Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    if(key.isAcceptable()) {
        // a connection was accepted by a ServerSocketChannel.
    } else if (key.isConnectable()) {
        // a connection was established with a remote server.
    } else if (key.isReadable()) {
        // a channel is ready for reading
    } else if (key.isWritable()) {
        // a channel is ready for writing
    }
    keyIterator.remove();
}

这个循环遍历已选择键集中的每个键,并检测各个键所对应的通道的就绪事件。
注意每次迭代末尾的keyIterator.remove()调用。Selector不会自己从已选择键集中移除SelectionKey实例。必须在处理完通道时自己移除。下次该通道变成就绪时,Selector会再次将其放入已选择键集中。
SelectionKey.channel()方法返回的通道需要转型成你要处理的类型,如ServerSocketChannel或SocketChannel等。
wakeUp()
某个线程调用select()方法后阻塞了,即使没有通道已经就绪,也有办法让其从select()方法返回。只要让其它线程在第一个线程调用select()方法的那个对象上调用Selector.wakeup()方法即可。阻塞在select()方法上的线程会立马返回。
如果有其它线程调用了wakeup()方法,但当前没有线程阻塞在select()方法上,下个调用select()方法的线程会立即“醒来(wake up)”。
close()
用完Selector后调用其close()方法会关闭该Selector,且使注册到该Selector上的所有SelectionKey实例无效。通道本身并不会关闭。
完整的示例
这里有一个完整的示例,打开一个Selector,注册一个通道注册到这个Selector上(通道的初始化过程略去),然后持续监控这个Selector的四种事件(接受,连接,读,写)是否就绪。

Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
  int readyChannels = selector.select();
  if(readyChannels == 0) continue;
  Set selectedKeys = selector.selectedKeys();
  Iterator keyIterator = selectedKeys.iterator();
  while(keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    if(key.isAcceptable()) {
        // a connection was accepted by a ServerSocketChannel.
    } else if (key.isConnectable()) {
        // a connection was established with a remote server.
    } else if (key.isReadable()) {
        // a channel is ready for reading
    } else if (key.isWritable()) {
        // a channel is ready for writing
    }
    keyIterator.remove();
  }
}

java selector 测试并发 java selector 测试并发.多线程并发。 立即下载

相关推荐

用示波器抓一次MIPI D-PHY的波形,手把手教你读懂HS模式和LP模式的切换时序

本文详细解析了MIPI D-PHY信号的双模切换机制,包括高速模式(HS)和低功耗模式(LP)的波形捕获与诊断技巧。通过示波器设置、关键状态分析和实战案例,帮助工程师快速定位信号完整性问题,提升调试效率。

weixin_30696427的博客 456

封装JNDI操作LDAP服务器的工具类4

/** *在当前连接的DirContext修改指定Context下的一个或多个属性 *@paramcontext连接的DirContext *@paramcn指定Context下的名字 *@paramattMap包含Listkey为属性名称,当属性为多值时 *value为包含多值的List,为单值...

weixin_34077371的博客 293

【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db - 环境变量配置与路径修复指南

本文详细解析了地理空间数据处理中常见的【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db 错误。该错误的根源是PROJ库无法定位其核心数据文件proj.db。文章提供了从问题诊断到修复的完整指南,包括如何在不同系统(Windows/macOS/Linux)和安装方式(Conda/pip/源码编译)下找到正确的proj.db文件路径,并通过设置PROJ_LIB环境变量(临时、代码内或永久)彻底解决问题,同时给出了进阶排查技巧和

m2n3o4p5的博客 557

java nio selector.select()_Java NIO 的前生今世 之四 NIO Selector 详解

SelectorSelector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一个线程中使用了多个 Channel, 因此也会造成了每个 Channel 传输效率的降低.使用 Selector 的图解如下:为了使用 Selector, 我们首先需要将 Channel 注册到 Sel...

weixin_42376793的博客 1283

Autoware.universe部署03:与Carla(二进制版)联调

本文介绍了 Autoware.universe 与 Carla 二进制版的联调过程。Autoware.universe 是一个开源的自动驾驶软件平台,而 Carla 则是一个用于自动驾驶仿真的开源工具。将这两者联调起来可以在仿真环境中测试和验证 Autoware.universe 的功能和性能,为自动驾驶系统的开发和测试提供有力支持。

zardforever123的博客 7368

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1048

【NIO】Selector(选择器)

前言 Github:GitHub - yihonglei/jdk-source-code-reading: JDK source code reading(java-nio) 一 Selector (选择器)概述 Selector(选择器)是 Java NIO 中能够检测到一到多个 NIO 通道,并能够知道通道是否为读写 事件做好准备。这样,一个单独的线程可以管理多个 Channel,从而管理多个网络连接。 仅用单个线程来处理多个 Channel的好处是,只需要更少的线程来处理通道。事实上, .

yhl_jxy的博客 6442

HDOCK 蛋白蛋白对接软件使用;LZerD、pyDock、ClusPro网页在线对接

参考:hdock支持蛋白与蛋白,也支持蛋白与核酸对接计算。

weixin_42357472的博客 1万+

nio学习之Selector选择器

nio学习之Selector选择器Selector选择器三个相关的类如何创建选择器SelectionKey选择键相关的方法选择器的使用服务器端模板代码selector.select()方法阻塞问题案例服务器端代码客户端代码补充说明select()方法的三个重载:停止选择的方法NIO 编程步骤总结 Selector选择器 选择器提供一种选择执行已经就绪的任务的能力 selector选择器可以让单线程处理多个通道 如果程序打开了多个连接通道,每个连接的流量都比较低,可以使用Selector对通道进行管理

m0_53157173的博客 3024

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

ABB变频器使用PROFINET IO通信模块时的激活方法

ABB变频器使用PROFINET IO通信模块时的激活方法

Robot_PLC_HMI_Automation 2734

Java NIO 原理浅析与 Channel Selector Buffer 三大概念讲解

本文知识点: NIO 工作原理 NIO 的三大概念 Channel Selector Buffer NIO 相比于BIO的优点 Java NIO 使用方法 前言 上一篇讲了Java BIO的使用和原理以及BIO模型带来的性能问题,BIO模型中每新增加一个连接就需要一个线程处理;可以使用线程池进行优化,但在10k、100k面前还是缚鸡之力;为了应对10k、100k的场景又演变出了另外一种网络I/O模型NIO。 Java原生NIO Java 4 提供了NIO的API,NIO主要有几个基础的概念:Channe

码农杰森 414

从零到精通:BLDC电机驱动电路详解与设计思路

这套电机驱动电路从核心控制器到反馈采集模块,涉及了BLDC电机驱动的方方面面。每一个模块的设计和选择都需要综合考虑系统需求和实际使用环境。在实际应用中,很多细微的设计改进都会显著影响电机的运行性能。

weixin_43199439的博客 3101

Java NIO学习系列三:Selector

前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调多个channel以同时读写数据,本文我们就来学习一下selector。   Java NIO中引入了"selector"的概念,一个selector其实是一个Java对象,能够通过诸如连接打开、数...

GarfieldEr007的专栏 722

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java NIO三大角色Channel、Buffer、Selector

从JDK 1.4开始支持NIO编程,虽然目前用Netty的人占大部分,但是我们还是要先了解下Java的NIO是怎么实现的,今天就来一探究竟

963

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java NIO三大核心之Selector概述

概述:Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接(多路复用),就会用到Selector(多路复用器/选择器)。 Selector能够检测多个注册通道channel上是否有事件发生(多个Channel以事件的方式注册多同一个Selector),类似基于epoll的多路复用,如果有事件发生,便获取事件,然后针对每个事件进行相应的处理,这个月就可以用单线程去处理多个连接和请求。 只有在连接/通道真正有读写事件发生时,才会进行读写,就大大减少了系统开销,并且不必为每个连接都创建一个

lixinkuan的博客 534

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java NIO入门(三)Selector

之前两篇文章写了关于NIO的博客,本来想一一口气写完这三篇的,但是由于前段时间项目特别赶,就把这篇给放下了,现在算是有些时间了,把第三篇写了。 之前两篇一篇是写了Buffer、一篇写了Channel,下面写NIO的第三个很重要的部分Selector。 什么是Selector 在nio出现之前,也就是jdk1.4以前要实现网络通信的话使用socket进行,使用socket进行网络通信就会出现网络...

牧羊少年 319

Java NIO学习总结三(Selector)

上一篇讲了NIO的缓冲区,在给出的例子中当有多个SocketChannel连接到服务器时,我们是通过遍历各个Channel来管理它们的输入输出,其实也可以交给NIO的选择器来管理,下面给出使用Selector的同等效果的实现: public class SelectorTest { public static void main(String[] args) { tr

c_craft的专栏 482

java nio 系列_Java NIO学习系列三:Selector

摘要:open();channel.configureBlocking(false);SelectionKeykey=channel.register(selector,SelectionKey.OP_READ);while(true){intreadyChannels=selector.selectNow();if(readyChannels==0)continue;Set前面的两篇文章中总结了...

weixin_35578381的博客 165

NIO 三大组件的使用:Java NIO:Buffer、Channel 和 Selector

转自:https://www.javadoop.com/post/java-nio 本文将介绍 Java NIO 中三大组件 Buffer、Channel、Selector 的使用。 本来要一起介绍非阻塞 IO 和 JDK7 的异步 IO 的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到另一篇文章中进行介绍。 Buffer position、limit、capaci...

Enthusiast的专栏 439

【三】Java NIO(channel、buffer、selector)

一、概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。 二、Channel 我理解的:每个连接就是一个channel 所有的 IO 在NIO 中都从一个Channel 开始。 Java NIO的通道类似流,但又有些不同: 1.既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 2.通道可以异步地读写。 3.通道中的数据总是要先读到一个

Sid小杰的博客 306

Java网络编程——NIO三大组件Buffer、Channel、Selector

Java NIO(Java Non-Blocking IO)也就是非阻塞IO,说是非阻塞IO,其实NIO也支持阻塞IO模型(默认就是),相对于BIO来说,NIO最大的特点是支持IO多路复用模式,可以通过一个线程监控多个IO流(Socket)的状态,来同时管理多个客户端,极大提高了服务器的吞吐能力。在NIO中有3个比较重要的组件:Buffer、Channel、Selector。......

点滴汇聚,智在积累。——Danny 1742

3. Java NIO之Selector如何实现(三)

Selector默认是WindowsSelectorImpl的一个实例, 当调用了SelectorImpl的select()方法的时候,调用selector(timeout),之后会调用lockAndDoSelect(),在这个方法中,主要调用了doSelect()方法,参数与传进来的一致,以WindowsSelectorImpl为例子,实现的doSelect()方法。 protected...

weixin_43257196 的博客 345

Java NIO 三大核心(Buffer、Channel、Selector)理解

NIO 三大核心(Buffer、Channel、Selector)

在路上 1098

Java基础学习总结:NIO之(三)NIO网络编程与Selector

一、使用NIO实现阻塞式网络编程 java.nio中与网络编程(TCP、UDP)相关的类有 ServerSocketChannel、SocketChannel 和 DatagramChannel。 1、ServerSocketChannel和SocketChannel (1)ServerSocketChannel: Java NIO 中的 ServerSocketChannel 是一个...

Vaingloryss的博客 255
上一篇: Java NIO Selector(二)
下一篇: Java NIO ServerSocketChannel
mylife512
博客等级 码龄10年 1463粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mylife512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值