抱歉,,實(shí)在是不知道這篇文章該有個(gè)上面主題,就這樣隨便寫一個(gè)名字吧
在java nio中selector函數(shù)會(huì)一直阻塞到至少有一個(gè)通道在你注冊(cè)事件上就緒。但是這個(gè)方法還有一個(gè)非常重要的一點(diǎn)。select()返回的是上一次到本次選擇,所增加的數(shù)目。
也就是說上一次選擇過后,Set中已經(jīng)存在了某一個(gè)Selectionkey沒有remove掉,那么下次selector.select(),選擇中不會(huì)包含這個(gè)鍵,但是集合中仍然有這個(gè)事件會(huì)被處理。
Set..iterator().remove()的作用,從選擇鍵集中刪除該建
與其相反selector.selectedKeys()中表示的選擇鍵集,該建集如果不remove掉會(huì)一直存在。
但是如果已經(jīng)從channel中把數(shù)據(jù)已經(jīng)讀出來(lái)了。則下次讀取不會(huì)包含該數(shù)據(jù),意思是這個(gè)鍵仍然是可讀的,但是讀不出來(lái)數(shù)據(jù)。
但是如果通道注冊(cè)的是write事件,這個(gè)可就要小心點(diǎn)了。
一般來(lái)說,你不應(yīng)該注冊(cè)寫事件。寫操作的就緒條件為底層緩沖區(qū)有空閑空間,而寫緩沖區(qū)絕大部分時(shí)間都是有空閑空間的,所以當(dāng)你注冊(cè)寫事件后,寫操作一直是就緒的,選擇處理線程全占用整個(gè)CPU資源。所以,只有當(dāng)你確實(shí)有數(shù)據(jù)要寫時(shí)再注冊(cè)寫操作,并在寫完以后馬上取消注冊(cè)。