Sunday 5 October 2008

Java Selector class (続き)

そういえば、ググっている途中で見つけたんだが、

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: