1. 程式人生 > >NIO程式設計中的SelectionKey.interestOps方法中的邏輯運算

NIO程式設計中的SelectionKey.interestOps方法中的邏輯運算

首先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 則不包含,用於檢測集合中是否包含想要檢測的這個值