Java の並行性において、スレッドを「アクティブ」にするものは何ですか? アイドリングしてないってことだけ?「待機中」または「一時停止中」のスレッドは、技術的にアクティブと見なされますか?
5 に答える
私が知る限り、「アクティブ」という用語はよく使われているようですが、定義されていません。ThreadGroup.enumerate()
メソッドは次のように文書化されています。
このスレッド グループとそのサブグループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。
this のソースを見ると、メソッドがチェックThread.isAlive()
され、それらが列挙可能に追加されます。このことから、「アクティブ」と「アライブ」という用語は交換可能であり、「アライブ」は次のように定義されると推測します。
スレッドが開始され、まだ終了していない場合、スレッドは生きています。
java.lang.Thread.State を見てください。
他の非 Java システムでは、アクティブは「RUNNABLE」と同等です。コードをアクティブに実行できる場合、タスク/プロセス/スレッドはアクティブです。そうでない場合は中断されます(ブロックなど)。
Stephen C が言ったように、アクティブはここでは Java ではなく英語として使用されています。
このコンテキストでは、「アクティブ」とは、コードを実行していることを意味します。非アクティブなスレッド (I/O 呼び出しでブロックされているか、ロックを待っているスレッド) は、CPU に影響を与えることなく (またはわずかに) メモリ リソースのみを消費します。
ただし、実際にはスレッドが何をしているかに依存します。各スレッドが素数を計算するために数値を反復処理している場合、それらは完全に CPU バウンドであり、スループットを最大化するにはコアごとに 1 つだけにする必要があります。HTTP リクエストを作成したり、ファイル I/O を実行したりする場合は、コアごとにかなりの数を用意できます。
結局のところ、スレッドが何をしているかに関係なく、すべてのスレッドを一般的に網羅する包括的なステートメントは、まったく価値がありません。
並行 Java プログラミングのトピックを質の高い方法で扱うには、『 Java Concurrency in Practice』という本を強くお勧めします。
「アクティブ」という言葉は、ここでは通常の英語の意味で使用されています。
アクティブという言葉の通常の英語の意味は、「何かをしている」です。したがって、スレッドの「アクティブ」の直感的な意味は、スレッドが実際に実行されているか、実行する準備ができていることです。
この引用の文脈では:
「コアあたり 4 ~ 20 のアクティブなスレッドを持つことは一般的に許容されます」
「アクティブ」という言葉はこれと一貫して使用されていますが、数字については疑問があります。(20はかなり高すぎます、IMO)。
ただし、これは意図的に曖昧な表現であると主張したいと思います。ギブアウェイは、イタチのフレーズ「一般的に受け入れられている」(特定の情報源を引用するのではなく)の使用と、幅広い範囲(「4〜20」)です。したがって、「アクティブ」という言葉は、意図的なあいまいさのもう 1 つの例であると主張できます。
IMO、引用の著者は、「スレッドが多すぎるのは悪い」という一般的な指摘をしようとしています...「多すぎる」とは何かについて正確に説明することはありません。彼の言う「能動的」に縛り付けて、より的確な導きを引き出すのは無意味だ。(そして明確にするために、「多すぎる」の数を言う ことはできません...一般的に。)
「コアあたり 4 ~ 20 のアクティブなスレッドを持つことは、一般的に許容されます」。– アダム・タノン
この意味で、この言葉は「生きている」やその他の可能な意味ではなく、「走る準備ができている」という意味だと思います。待機中のスレッドの値を取得せず、スケジューリングとコンテキスト スイッチのオーバーヘッドに寄与するため、レディ キューに少数のスレッドしか持たないことは理にかなっています。一方、すぐに実行できるスレッドがコアよりも少ない場合は、利用可能なリソースを活用していません。