質問
この書き:
int selectedChannels = selector.select(); Set selectedKeys = selector.selectedKeys(); if ( selectedChannels != selectedKeys.size() ) { // Selector.select() returned because of a call to Selector.wakeup() // so do synchronization. } // Continue with handling selected channels.
で正確に検出するお目覚めtv-電話のかけ方は?
Backgroundinformation:
書いたサーバーのほとんどの時間だけが受信パケットのいずれかにおいて、ファイルです。ついてはほとんどの申請を送る必要があれ自体が特別です。これを始める(別のスレッドのサーバソケット:
SocketChannel channel = SocketChannel.open(); channel.configureBlocking( false ); channel.connect( new InetSocketAddress( InetAddress.getLocalHost(), PORT )); selector.wakeup(); SelectionKey key = channel.register( selector, SelectionKey.OP_CONNECT );
問題はSelectableChannel.register()がブロックの場合のメインスレッドがすでにセレクタをクローズします。select().これを防ぐために私は呼び出しセレクタをクローズします。お目覚めtv()するようにメインスレッドを返し説から選択().かどうかを確認するために他のスレッドにとっては完全に登録通っていたと思いを同期させるためにメインスレッドがいいで 毎 から選択().がんを検出することができるかどうかでから返されたselect()でお目覚めtv()を呼び出しが最適になるようにしただけます。
なので、理論的にトップコードスニペットは、たかだいに依存しているため、一部の不特定的に振る舞えるのでしょうか?
たずきな示唆を得ることができ
解決
したものではないでしょうかは、ここで提案したスニペットが全く働かないので、原則として当たりの契約の Selector#select()
や Selector#selectedKeys()
.から セレクタ:
- 選択されたキーセットのキーセットはそれぞれ、そのキーのチャネルが検出されたけることができる状態にします。少なくとも一つの操作で特定されたキーの対象セットが、前回選択時動作します。このセットで返されるselectedKeys方法です。
public abstract int select(long timeout) throws IOException Returns: The number of keys, possibly zero, whose ready-operation sets were updated
などを読んで、サイズの selectedKeys
セットは、常に同等の番号で返される select
により定義で設定します。いということに気付き-きもの-その一部の実装ではないものによる文書作成の実際 selectedKeys
すべてのキーは更新の準備-運営が定めのないものであっても更新時の呼び出し select
.のその他の指標に選択し起により呼び出し wakeup
あるキーの数がゼロしかしいずれかの方法が信頼できないです。
通常の方法で取り扱うこと黙示を通じて、並行処理です。ない悩み実行時間はこちらこのクラシックの例 早期の最適化.
ませんが一桁マイクロ秒の公差んせ減速さや大きが気になるレベルの許容差は、 Selector
がなくなるわけではありませんまったりとしたつくりで使いやすい。
以下に例を示します(通常の機構を使用 ReentrantLock
の達成に適切な並行処理:
ReentrantLock selectorGuard;
Selector selector;
private void doSelect() {
// Don't enter a select if another thread is in a critical block
selectorGuard.lock();
selectorGuard.unlock();
selector.select();
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while(keyIter.hasNext()) {
SelectionKey key = keyIter.next();
keyIter.remove();
// Process key
}
}
private void addToSelector() {
// Lock the selector guard to prevent another select until complete
selectorGuard.lock();
try {
selector.wakeup();
// Do logic that registers channel with selector appropriately
} finally {
selectorGuard.unlock();
}
}
他のヒント
かわからないのはなぜコードも一般的です。
なぜならずチェック volatile
後 select
?
の場合 select()
ゼロを返しまいずれかでかわで目が覚めた。
したりすることはできませんっていることをご確認ください理由は、セレクタに起きたのお目覚めtv電話します。また、ソケットです。
く必要があり、呼び出し側のお目覚めtvものように設定揮発性を示すboolean、その願います。には、セレクタのループをチェックすることができる価値をbooleanで目を覚ます。