首页 > 编程语言 >并发编程之Java中Selector

并发编程之Java中Selector

时间:2024-04-08 21:29:58浏览次数:25  
标签:Java 编程 Selector 事件 key SelectionKey channel OP

系列文章目录


文章目录


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


Selector提供选择执行已经就绪的任务的能力,使得多元 I/O 成为可能,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/O channel。

C/C++许多年前就已经有 select()和 poll()这两个POSIX(可移植性操作系统接口)系统调用可供使用。许多os也提供相似的功能,但对Java 程序员来说,就绪选择功能直到 JDK 1.4 才成为可行方案。
在这里插入图片描述
Selector的创建过程如下:

// 1.创建Selector
Selector selector = Selector.open();
 
// 2.将Channel注册到选择器中
// ....... new channel的过程 ....
 
//Notes:channel要注册到Selector上就必须是非阻塞的,所以FileChannel是不可以使用Selector的,因为FileChannel是阻塞的
channel.configureBlocking(false);
 
// 第二个参数指定了我们对 Channel 的什么类型的事件感兴趣
SelectionKey key = channel.register(selector , SelectionKey.OP_READ);
 
// 也可以使用或运算|来组合多个事件,例如
SelectionKey key = channel.register(selector , SelectionKey.OP_READ | SelectionKey.OP_WRITE);
 
// 不过值得注意的是,一个 Channel 仅仅可以被注册到一个 Selector 一次, 如果将 Channel 注册到 Selector 多次, 那么其实就是相当于更新 SelectionKey 的 interest set.

一个Channel在Selector注册其代表的是一个SelectionKey事件

SelectionKey的类型包括:
OP_READ:可读事件;值为:1<<0

OP_WRITE:可写事件;值为:1<<2

OP_CONNECT:客户端连接服务端的事件(tcp连接),一般为创建SocketChannel客户端channel;值为:1<<3

OP_ACCEPT:服务端接收客户端连接的事件,一般为创建ServerSocketChannel服务端channel;值为:1<<4

一个Selector内部维护了三组keys:

key set:
当前channel注册在Selector上所有的key;可调用keys()获取

selected-key set:当前channel就绪的事件;可调用selectedKeys()获取

cancelled-key:主动触发SelectionKey#cancel()方法会放在该集合,前提条件是该channel没有被取消注册;不可通过外部方法调用

Selector类中总共包含以下10个方法:
open():创建一个Selector对象

isOpen():是否是open状态,如果调用了close()方法则会返回false

provider():获取当前Selector的Provider

keys():如上文所述,获取当前channel注册在Selector上所有的key

selectedKeys():获取当前channel就绪的事件列表

selectNow():获取当前是否有事件就绪,该方法立即返回结果,不会阻塞;如果返回值>0,则代表存在一个或多个

select(long timeout):selectNow的阻塞超时方法,超时时间内,有事件就绪时才会返回;否则超过时间也会返回

select():selectNow的阻塞方法,直到有事件就绪时才会返回

wakeup():调用该方法会时,阻塞在select()处的线程会立马返回;(ps:下面一句划重点)即使当前不存在线程阻塞在select()处,那么下一个执行select()方法的线程也会立即返回结果,相当于执行了一次selectNow()方法

close(): 用完Selector后调用其close()方法会关闭该Selector,且使注册到该Selector上的所有SelectionKey实例无效。channel本身并不会关闭。

关于SelectionKey
谈到Selector就不得不提SelectionKey,两者是紧密关联,配合使用的;如上文所示,往Channel注册Selector会返回一个SelectionKey对象,

这个对象包含了如下内容:

interest set,当前Channel感兴趣的事件集,即在调用register方法设置的interes set

ready set

channel

selector

attached object,可选的附加对象

interest set

可以通过SelectionKey类中的方法来获取和设置interes set

// 返回当前感兴趣的事件列表
int interestSet = key.interestOps();
 
// 也可通过interestSet判断其中包含的事件
boolean isInterestedInAccept  = interestSet & SelectionKey.OP_ACCEPT;
boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT;
boolean isInterestedInRead    = interestSet & SelectionKey.OP_READ;
boolean isInterestedInWrite   = interestSet & SelectionKey.OP_WRITE;    
 
// 可以通过interestOps(int ops)方法修改事件列表
key.interestOps(interestSet | SelectionKey.OP_WRITE);

ready set

当前Channel就绪的事件列表

int readySet = key.readyOps();
 
// 也可通过四个方法来分别判断不同事件是否就绪
key.isReadable();    //读事件是否就绪
key.isWritable();    //写事件是否就绪
key.isConnectable(); //客户端连接事件是否就绪
key.isAcceptable();  //服务端连接事件是否就绪

channel和selector

我们可以通过SelectionKey来获取当前的channel和selector

// 返回当前事件关联的通道,可转换的选项包括:`ServerSocketChannel`和`SocketChannel`
Channel channel = key.channel();
 
//返回当前事件所关联的Selector对象
Selector selector = key.selector();

attached object

我们可以在selectionKey中附加一个对象:

key.attach(theObject);
Object attachedObj = key.attachment();

或者在注册时直接附加:

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

标签:Java,编程,Selector,事件,key,SelectionKey,channel,OP
From: https://blog.csdn.net/pleaseprintf/article/details/137480648

相关文章

  • python画信封 2024年3月青少年电子学会等级考试 中小学生python编程等级考试一级真题
    目录python画信封一、题目要求二、算法分析三、程序代码四、程序说明五、运行结果六、考点分析七、推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python画信封2024年3月python考级一级真题一、题目要求龙年到了,我们要给远方的亲人写一封新年贺信,请用turtle......
  • Python实战:Python在物联网(IoT)设备编程中的应用
    1.引言物联网(IoT)是一个由相互连接的物理设备组成的网络,这些设备可以通过互联网进行通信和交换数据。Python作为一种功能强大的编程语言,被广泛应用于物联网设备的编程和开发中。通过Python,我们可以轻松地实现设备之间的数据通信、设备控制等功能。2.环境准备在开......
  • 实验2 C语言分支与循环基础应用编程
    task1.c问题一:生成1~65中的随机数问题二:随机生成5个本班学号task2.c1#include<stdio.h>2intmain()3{4charcolour;5printf("请输入交通信号灯的颜色:");6while((colour=getchar())!=EOF)7{8switch(colour)9......
  • Mysql 报 java.sql.SQLException:null,message from server:“Host ‘‘ is not allow
    这个错误i是因为mysql数据库没有放开远程访问权限引起的,以mysql8为例首先进入Mysql安装目录,然后输入命令:mysql-uroot-p;具体参见下图:再输入usemysql;回车执行,接着输入,showtables;回车执行输入,selecthostfromuser;回车执行,这里特别说明一下,我这个是已经放......
  • 点击按钮框来选择相应信息(Vue + Java)
    目录前言1.前端2.后端3.总结前言从Java转全栈,对于项目中的功能,从无到有,都会以笔记的形式记录,方便自身的总结以及翻阅原先的知识点参考:java框架零基础从入门到精通的学习路线附开源项目面经等(超全)前后端实现下拉框带条件查询(Vue+Java)通过点击按钮框给予数据选......
  • 任务处理【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-任务处理在某个项目中有多个任务(用tasks数组表示)需要您进行处理,其中tasks[i]=[si,ei],你可以在si<=day<=ei中的任意一天处理该任务。请返回你可以处理的最大任务数。注:一天可以完成一个任务的处理。输入描述:第一行为任务数量n,1<=n<=100000。后......
  • 跳马【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • day14 java接口
    接口接口:对不同类型不同事物相同功能的描述(一定程序上解决了单继承的局限性)接口可以理解成一种标准规范当类实现这个接口就实现了这个标准或规范接口的格式:权限修饰符interface接口名{}权限修饰符只能是public和缺省的。说明:1.类和接口是......
  • Java面向对象01——类与对象
    大家好,我是白夜,今天和大家聊聊类与对象一、初识面向对象(了解)1.1、面向过程和面向对象面向过程编程C语言就是面向过程编程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。面向对象编程JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象......
  • 【javaWeb &第十二篇】MybatisPlus
    MybatisPlus详细学习快速入门MybatisPlus特性标准数据层开发分页查询按条件查询查询投影DQL编程控制DML编程控制逻辑删除乐观锁代码生成器快速入门MybatisPlus是基于Mybatis框架基础上开发的增强型工具,旨在简化开发,提高效率官方地址:http://mp.baomidou.com/开......