http://www.javareading.com/bof/network2.html
4.5.3 Selectorクラス
■なぜチャネルにセレクタを登録するのか?
--> 逆の「セレクタにチャネルを登録する」のほうが自然なのに...
--> なぜこのような設計になったのか、情報求む!!
ですが、これは実装を考えると、すぐにわかります。
read() でデータがなくて待っているthread A
select() でreadableになるのを待っているthread B
に対して、write()があったら、
A 用に、read()がwait()しているobjectに notify()する
B 用に、select()がwait()しているselectorに notifyAll()する
ということをするわけなんだけど、そのためには、write()したchannelがselectorを知らないとnotifyAll()する必要があります。つまり、channelにselectorを登録する必要があるわけ。
channelがselectorを知らないと、寝ているselectorを起こす方法がありません。
まぁ、もちろん、「セレクタにチャネルを登録する」作業の中で、「チャネルにセレクタを登録」してやれば良いだけなんだけど。
No comments:
Post a Comment