2017-02-01 7 views
-1

いくつかの異なるNIOチャネルおよびその他のオブジェクトを処理する多少複雑なループがあります。これらのオブジェクトのいくつかは、Selectorを呼び出すことによって、それらの処理をトリガする(すなわち、「選択」事象をシミュレートする)。 wakeup()。私は誤って常にselect()へのすべての呼び出しの前ウェイクアップ()を呼び出すことによって、ビジーループに私のスレッドを置くときselect()より前にwakeup()が呼び出された場合、Selector.select()はselectedKeys()を満たさない

、私は私の他のNIOのチャネルは、もはやすべてでサービスを取得していることに気づいていません。ビジーループを引き起こす条件がなくなるとすぐに、他のすべてのチャネルは直ちに通常どおりに再びサービスされました。もはやサービスを受けて、私の他のチャンネルの理由は、それがすぐに返された場合がselect()selectedKeys()のリストを記入しなかったことだったと私は考え出しこのいじりのビットの後

保留中のためにウェイクアップです。

これが期待どおりの動作ですか?私はこの詳細についてはドキュメントで何も見つけることができませんでした。
その場合、追加のselectNow()を持つすべての選択()に従うことによって、より多くのエレガントこれを防ぐ方法はありますか?

答えて

0

もちろん、それは予想されます。ウェイクアップのためすぐに再調整されたので、準備ができたチャンネルを探したり、選択したキーなどを埋め込むことをブロックしませんでした。

+0

これはどこかに記載されていますか?私はそれを仮定していたwakeup(); select(); selectNow()と同等です。 –

+0

私は、wakeup(); selectNow();選択されたキーにも値が設定されませんか? –

関連する問題