NIO编程中的SelectionKey.interestOps方法中的逻辑运算

本文详细解析了Java NIO中SelectionKey的四种操作:读、写、连接和接受,并通过具体的位运算示例说明了如何添加、删除及检查这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


首先interestOps() 方法有四个参数,分别是【SelectionKey.op_read,SelectionKey.op_write,SelectionKey.op_connect,SelectionKey.op_accept】

其中 read ==1<<0  ==1 ==0000 0001

write==1<<2==4==0000 0100

connect==1<<3==8==0000 1000

accept==1<<4==16==0001 0000


假设默认注册时

SocketChannel open=SocketChannel.open();
SelectionKey key = open.register(selector, SelectionKey.OP_Read);

这样我们 得到的就是 1 

重新调用带参数的 keykey.interestOps(value) 可以覆盖上面的值 keykey.interestOps(0) 代笔取消上面的四个监听,代表不监听任何东西
所以有了这些,逻辑运算就很好解释了

sk.interestOps(sk.interestOps()& ~SelectionKey.OP_READ); //首先“~”符号代表按位取反,,“&”代表按位 与,
首先“~”符号代表按位取反,,“&”代表按位 与,
sk.interestOps()得到当前的,我们不管他是多少,假设是write 也就是0000 0100 ,而read按位取反后就是1111 1110 ,与上面的进行“&”操作
read的取反一共八位,七位为1 一位为0,为1的与先前的write进行“&”操作则保持不变,原来是多少就是多少,0与前面的“&”操作就是置0
设置过后变成0000 0100 ,也就是不变。


那如果刚开始就是read   0000 0001 进行操作后前七位不变,最后一位置0,就变成0000 0000 .相当于如果先前是read 就删除read,如果刚开始没有
read就保持不变。


如果刚开始时是 0000 0101  代表read和write都有,经过
“& ~SelectionKey.OP_READ”
后变成0000 0100 只剩下write,相当于删除了read
所以 “&~xx”相当于删除xx,有就删除,没有就不变。



再来看 sk.interestOps()| SelectionKey.OP_READ 是什么意思

首先明白 0|0 =0,1|0=1,0|1=1,1|1=1
原来是什么不重要 假设是xxxx xxxx ,我们与0000 0001 进行 “|” 操作后,前期为0并不会对前期为 x 造成改变,原来是啥还是啥。
最后一位1 会让 最后一位x变成 1 ,无论以前是0还是1都变成1,所以变成xxxx xxx1,这样就一定会包含read操作。


假设以前是write 即0000 0100,经过变化后变成 0000 0101,即read 和write。


另外将0作为参数传进去,代表删除所有的,无论是什么。


所以 “&~xx” 代表取消xx   ”|xx“ 代表将xx添加进去  




在补充一点,如果原来是xxxx xxxx 这样一个集合,我们不知道是是什么,我们想检测 其中是否包含read 则
xxxx xxxx & 0000 0001 如果结果等于0000 0001 则包含,结果为0 则不包含,用于检测集合中是否包含想要检测的这个值


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值