0

selectorObj.select()メソッド状態 のドキュメント

このメソッドは、ブロック選択操作を実行します。少なくとも 1 つのチャネルが選択された後、このセレクターの wakeup メソッドが呼び出された後、または現在のスレッドが中断されたときのいずれか早い方でのみ戻ります。

ドキュメントを理解しました 選択メソッドによってブロックされたスレッドは、待機するべきではありませんか? プロファイラーを実行すると、スレッドが待機状態ではなく実行モードになっていることがわかります。

私はそれを受け入れますが、スレッドが待機状態にある必要があることは言及されていませんが、シグナルディスパッチャースレッドがセレクターに登録されたチャネルのアクティビティに関する何らかの入力を提供するまで、それは私の仮定です。スレッドは待機状態である必要があります。

なぜ私の仮定が間違っている可能性があるのか​​ について、いくつかの助けを提供してください。

4

3 に答える 3

1

スレッドが I/O 呼び出しでブロックされている場合でも、Java スレッドに関する限り、スレッドは引き続き実行されます。

ほとんどのプロファイラーは、次のように定義されているスレッドの状態を表示するだけです。

  • NEW まだ開始されていないスレッドがこの状態にあります。
  • RUNNABLE Java 仮想マシンで実行中のスレッドは、この状態にあります。
  • BLOCKED モニターロックを待ってブロックされているスレッドは、この状態にあります。
  • WAITING 別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態にあります。
  • TIMED_WAITING 別のスレッドがアクションを実行するのを指定された待機時間まで待機しているスレッドは、この状態にあります。
  • TERMINATED 終了したスレッドはこの状態にあります。

ご覧のとおり、スレッドの WAITING/BLOCKED 状態は I/O とは関係ありません。

于 2009-10-04T14:32:55.240 に答える
0

通常、select操作はpoll(...)システム関数を呼び出します。

select()は、カーネルに、読み取り/書き込み/エラー状態とタイムアウト値を監視する必要があるファイル記述子のリストを提供します。カーネルは、プロセス/スレッドを関連するチャネルのselect関数に登録し、プロセス/スレッドをスリープ状態にします。関連するチャネルの準備が整うか、タイマーの期限が切れると、カーネルは登録されたプロセス/スレッドをウェイクアップします。このスレッドはカーネルスレッドであり、Javaアプリケーションスレッドではないことに注意してください。

selectを実行しているスレッドがWAIT状態になる理由はわかりません(Selectorプロバイダーによって返されたSelectorの実装がselect()関数で明示的に待機した場合を除く)。

于 2009-10-07T23:18:09.637 に答える
0

It depends on the profiler. JProfiler shows the time when the selector thread is blocked on Selector.select() as "Network I/O". So, the best way to interpret the blocked Selector.select() as "Waiting for data".

Hope this helps.

Regards,

Slava Imeshev

Cacheonix In-Memory Data Grid

于 2012-01-12T03:36:55.000 に答える