NIO网络编程之Selector介绍

Selector

要实现异步IO要通过Selector,甚至我们可以通过一个线程管理多个Channel的读写,这是NIO相较BIO的优越之处之一。

Channel可以注册到一个Selector上,Selector可以监视多个Channel的状态

Channel的状态有四种:

  • CONNECT
  • ACCEPT
  • READ
  • WRITE

CONNECT代表某个Channel成功连接到另一个服务器(客户端)。ACCEPT则是一个ServerSocketChannel准备好接收新连接(服务端)。READ代表该Channel有数据可读,WRITE代表该Channel等待写操作。

这些状态在Java中对应SelectionKey中的四个常量

  • SelectionKey.OP_CONNECT
  • SelectionKey.OP_ACCEPT
  • SelectionKey.OP_READ
  • SelectionKey.OP_WRITE

在给Channel注册到Selector时可以指定要监听的状态:

channel.configureBlocking(false);
SelectionKey key =channel.register(selector,SelectionKey.OP_READ);

这个状态可以是多个状态合成的,我们叫它interestOps,是任意几个状态的位或结果。

register方法可以返回一个SelectionKey,作为注册在该Selector上的Channel的唯一标识(一个Selector-Channel对)。

Selector的常用API:

  • int select():阻塞等待,直到至少有一个绑定的Channel符合监听的状态,返回符合状态Channel的个数,也可能是0(如果中途有一个Key的interestOps被更新了)。
  • int select(long timeout) :阻塞等待限制一个最长时间,超过时间直接返回。
  • int selectNow():不阻塞,直接查询有几个符合监听状态的Channel。
  • Set<SelectionKey> selectedKeys():经过任一select操作后可以获取被select到的keys。
  • Selector wakeup():如果一个线程调用select()方法阻塞了,可以让另一个线程调用同一个Selector上的wakeup()方法来唤醒这个线程。
  • void close():关闭这个Selector。

SelectionKey

SelectionKey的常用API:

  • int interestOps():返回interestOps,可以通过与常量进行位与来判断是否含有某个状态。
  • int readyOps():返回的是有哪些监听的状态目前是对应的,也是合成值,可以通过与常量进行位与来判断是否含有某个状态。或者直接调用isConnectable,isAcceptable,isReadable,isWritable
  • SelectableChannel channel():获取这个SelectionKey对应的Channel
  • Selector selector(): 获取这个SelectionKey对应的Selector
  • Object attach(Object ob):给这个SelectionKey附加一个Object对象
  • Object attachment():获取这个附加的Object对象

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/nio%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b9%8bselector%e4%bb%8b%e7%bb%8d/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月7日
下一篇 2020年2月7日

相关推荐

  • 谈谈Java中的Iterator

    摘要 Iterator的作用? Iterator和Enumeration的区别? Iterator和ListIterator的区别? Iterator和foreach的关联? It…

    Java 2019年12月6日
    0160
  • 操作系统五种IO模型介绍

    本文参考资源: 五种IO模型详解IO模型,java小范的博客-CSDN博客 阻塞 IO 模型 最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求…

    计算机相关 2020年2月12日
    0700
  • 网络编程之AIO

    AIO介绍 AIO是JDK1.7引入的,也称为NIO 2.0 NIO的同步非阻塞类似于轮询,让Selector去询问各个通道的状态。 而AIO则是通过Future实现真正的异步,让…

    Java 2020年2月8日
    0280
  • Collection接口研究

    以下内容基于jdk1.8 接口Collection分析 img 该接口实现了接口Iterable 方法: int size(); 返回元素的个数 boolean isEmpty()…

    2019年11月13日
    090
  • 日志门面介绍和JCL使用

    日志门面概述 之前有写过Java日志框架JUL和Log4j介绍,可以对比发现它们之间的使用还是有一些区别的,比如有一些类名是不同的、日志的输出级别也不完全一致。 那么实际上是增大了…

  • 深入理解java虚拟机第三版读书笔记11

    以下是第十一章 后端编译与优化的内容 把Class文件转换成与本地基础设施(硬件指令集、操作系统)相关的二进制机器码可以视为整个编译过程的后端。 最近几年提前编译也开始兴起,我们在…

    2020年1月27日
    0270
  • 为什么说Java只有值传递?

    先说一下。。以后可能不会怎么写Java相关的博客了,因为找到了字节跳动的实习工作,用Go/Python开发后端,所以这几天在抓紧时间学Go,在学Go的时候,了解到Go语言只有值传递…

    Java 2020年6月26日
    03080
  • 深入理解java虚拟机第三版读书笔记04

    以下是第三章 垃圾收集器与内存分配策略的内容 概述 程序计数器、虚拟机栈、本地方法栈是线程独有的,栈帧更是随方法结束而消亡,不需要垃圾回收。而堆和方法区则需要经过垃圾回收的设计 对…

    2020年1月8日
    0280
  • Java日志框架Logback介绍和使用

    前置知识: 日志门面SLF4J介绍和使用 Logback概述 Logback是由log4j、slf4j创始人Ceki Gülcü设计的另一个开源日志组件,性能比log4j要好。它自…

  • Java基础查缺补漏01

    某些点会在不远的将来深挖。 >>是逻辑右移,>>>是算术右移 JDK6 可以使用Console.readPassword从控制台中读取密码,用户输入的过程中密码是不可见的。…

    2019年11月26日
    0590

发表回复

登录后才能评论