nio selector
1197 ワード
なぜSelectorを使うのですか?
単一スレッドのみで複数のチャネルを処理する利点は、チャネルを処理するためにより少ないスレッドしか必要としないことである.実際には、すべてのチャネルを1つのスレッドで処理することができます.オペレーティングシステムでは、スレッド間のコンテキスト切り替えのオーバーヘッドが大きく、各スレッドはメモリなどのシステムのリソースを消費します.したがって,使用するスレッドは少ないほどよい.
しかし、現代のオペレーティングシステムやCPUはマルチタスクの面でますますよくなっているため、マルチスレッドのオーバーヘッドは時間が経つにつれて小さくなっていることを覚えておく必要があります.実際には、1つのCPUに複数のコアがある場合、マルチタスクを使用しないとCPUの能力が浪費される可能性があります.いずれにしても、そのデザインについての議論は別の文章に置くべきだ.ここでは,Selectorを用いて複数のチャネルを扱うことができることを知れば十分である.
次に、単一スレッドが1つのSelectorを使用して3つのchannelを処理する例を示します.
Selectorの作成
Selectorを呼び出す.Open()メソッドは、次のようにSelectorを作成します.
Selectorへのチャネルの登録
チャンネルとSelectorを併用するには、チャンネルをselectorに登録する必要があります.SelectableChannelを通ります.register()メソッドは、以下のように実装される.
view source
print ?
Selectorと一緒に使用する場合、Channelは非ブロックモードでなければなりません.これは、FileChannelを非ブロッキングモードに切り替えることができないため、FileChannelをSelectorとともに使用できないことを意味します.ソケットチャネルはすべて可能です.
単一スレッドのみで複数のチャネルを処理する利点は、チャネルを処理するためにより少ないスレッドしか必要としないことである.実際には、すべてのチャネルを1つのスレッドで処理することができます.オペレーティングシステムでは、スレッド間のコンテキスト切り替えのオーバーヘッドが大きく、各スレッドはメモリなどのシステムのリソースを消費します.したがって,使用するスレッドは少ないほどよい.
しかし、現代のオペレーティングシステムやCPUはマルチタスクの面でますますよくなっているため、マルチスレッドのオーバーヘッドは時間が経つにつれて小さくなっていることを覚えておく必要があります.実際には、1つのCPUに複数のコアがある場合、マルチタスクを使用しないとCPUの能力が浪費される可能性があります.いずれにしても、そのデザインについての議論は別の文章に置くべきだ.ここでは,Selectorを用いて複数のチャネルを扱うことができることを知れば十分である.
次に、単一スレッドが1つのSelectorを使用して3つのchannelを処理する例を示します.
Selectorの作成
Selectorを呼び出す.Open()メソッドは、次のようにSelectorを作成します.
1
Selector selector = Selector.open();
Selectorへのチャネルの登録
チャンネルとSelectorを併用するには、チャンネルをselectorに登録する必要があります.SelectableChannelを通ります.register()メソッドは、以下のように実装される.
view source
print ?
1
channel.configureBlocking(
false
);
2
SelectionKey key = channel.register(selector,
3
Selectionkey.OP_READ);
Selectorと一緒に使用する場合、Channelは非ブロックモードでなければなりません.これは、FileChannelを非ブロッキングモードに切り替えることができないため、FileChannelをSelectorとともに使用できないことを意味します.ソケットチャネルはすべて可能です.