待機と通知は、スレッド間で渡されるメッセージのように見えます。これが当てはまる場合、これらのメッセージをバッファリングするためのキューが必要です。もしそうなら、キューにメッセージを追加したりキューからメッセージを削除したりするためのアトミック操作が必要であり、これらのメッセージをリッスンする各 Java スレッドのヘルパー スレッドも必要ですか?
ご意見をお聞かせいただければ幸いです。
待機と通知は、スレッド間で渡されるメッセージのように見えます。これが当てはまる場合、これらのメッセージをバッファリングするためのキューが必要です。もしそうなら、キューにメッセージを追加したりキューからメッセージを削除したりするためのアトミック操作が必要であり、これらのメッセージをリッスンする各 Java スレッドのヘルパー スレッドも必要ですか?
ご意見をお聞かせいただければ幸いです。
待機と通知は、スレッド間で渡されるメッセージのように見えますが、
それらは実際にはメッセージではありません。スレッドが呼び出すwait()
と、そのスレッドは特定のオブジェクト モニターに関連付けられた待機キューに入れられます。別のスレッドが呼び出すnotify()
と、最初のスレッド (存在する場合) がキューから取り出され、「実行」キューに入れられます。スレッドの状態を変更し、スレッド間のメッセージではなくスレッドをキューに入れることです。
その場合、キューにメッセージを追加したり、キューからメッセージを削除したりするためのアトミック操作が必要です
ほとんどの場合、メッセージ キューに関するアトミック操作はありませんが、メモリ ロケーションのテスト/設定に関するアトミック操作は確かにあり、ロックを取得して他のスレッドの競合を解決するのに役立ちます。
これらのメッセージをリッスンする Java スレッドごとにヘルパー スレッドが必要ですか?
Java スレッドごとにヘルパー スレッドが存在するわけではありません。Java スレッドがある状態から別の状態に遷移するか、タイム スライスされると、その状態を維持し、すべてのメッセージングとシグナリングを行う関連する OS スレッドが Java スレッドに関連付けられます。ほとんどの (すべてではないにしても) 実装では、Java アカウンティングを実行するために JVM ネイティブ コードを残して、スレッド スケジューリングを処理する OS とハードウェアも備えています。
JVM は、OS または場合によってはサードパーティ ライブラリによって提供されるプリミティブを使用します。これらを実装する JVM はありません。通常、Windows JVM は Windows スレッドを使用しますが、Linux では、実装で Linux カーネル スレッドまたは POSIX Threads ( pthreads
) ライブラリのいずれかを使用できます。Mac OS X では、選択肢にはpthreads
または CocoaNSThread
ライブラリが含まれます。