7

私はスレッドとプロセスの違いについて読んでいましたが、文字通りオンラインのどこでも、1つの違いはあまり説明なしで一般的に書かれています:

プロセスがブロックされた場合、残りのプロセスは実行を継続できます。ユーザー レベルのスレッドがブロックされると、そのピア スレッドもすべてブロックされます。

私には意味がありません。スケジューラがブロックされたスレッドと準備完了/実行可能なスレッドを切り替えることができない場合、同時実行の意味は何でしょうか。与えられた理由は、OS は特定の親プロセスのさまざまなスレッドを区別しないため、それらすべてを一度にブロックするためです。

親プロセスのメモリ空間内でのみ有効であっても、最近のすべての OS にはスレッド ID を持つスレッド制御ブロックがあるため、非常に説得力がないと思います。Galvin のオペレーティング システムの本にある例のように、スペル チェック スレッドが何らかのオンライン辞書に接続できない場合に、入力を処理しているスレッドをブロックしたくありません。

私がこの概念を間違って理解しているか、これらの Web サイトはすべて、何年にもわたって古いスレッドの違いをコピーしただけです。さらに、Galvin のような本や、スレッドが議論されている William Stalling の COA の本には、この声明を見つけることができません。

これらは、ステートメントを見つけたリソースです。

4

3 に答える 3

2

さて、他の回答は詳細な情報を提供します。

しかし、メインの変換を真ん中に当てるには:

  • この記事では、必要なコンテキストが欠けているため、少し間違っています (詳細については、@akuzminykh のユーザーレベルのスレッドとカーネルレベルのスレッドに関する説明を参照してください)。
  • これが Java プログラマーにとって何を意味するか: これらの説明は気にしないでください。Java スレッドの 1 つが (I/O などにより) ブロックされた場合、他のスレッドに影響はありません (もちろん、明示的にブロックしたい場合を除きますが、その場合はメカニズムを明示的に使用する必要があります)。それ)

Javaでスレッドがどのようにブロックされるのですか?

  • sleep()またはなどを呼び出すとwait()、現在そのコードを実行しているスレッド (呼び出したオブジェクトではない) がブロックされます。これらは特定のイベントで解放されます。タイマーが切れるか、スレッドが別のスレッドによって中断されるとスリープは終了し、別のスレッドから通知を受けると待機が解放されます。
  • synchronized(lockObj)ブロックまたはメソッドに遭遇した場合: そのlockObjを占有している他のスレッドがそれを解放すると、これは解放されます
    • これに密接に関連して、ThreadGates やミューテックスなどを入力すると、ランデブーなどの拡張スレッド制御用の数千の特殊なクラスがすべて含まれます。
  • InputStreametc:からのブロック読み取りなど、ブロッキング I/O メソッドを呼び出す場合int amountOfBytesRead = read(buffer, offset, length)、またはString line = myBufferedReader.readLine();
    • それとは対照的に、ほとんどの java.nio (ノンブロッキング I/O) パッケージのように、すぐに戻るが無効な結果値を示す可能性がある多くのノンブロッキング I/O 操作があります。
  • ガベージ コレクターがクイック クリーンアップ サイクルを実行する場合 (通常は非常に短いため気付かない程度で、スレッドは再び自動的に解放されます)
  • .parallelStream()ストリームで特定の長続きするラムダ関数の関数を呼び出す場合( などmyList.parallelStream().forEach(myConsumerAction))、複雑すぎるか、要素が多すぎる場合は、自動化されたマルチスレッド メカニズムによって処理されます (これには気付かないでしょう。全体が完了した後、呼び出し通常のメソッドが呼び出されたかのように、スレッドは正常に再開します)。詳細はこちら: https://www.baeldung.com/java-when-to-use-parallel-stream
于 2021-08-30T20:57:26.810 に答える