8

Java の並行性において、スレッドを「アクティブ」にするものは何ですか? アイドリングしてないってことだけ?「待機中」または「一時停止中」のスレッドは、技術的にアクティブと見なされますか?

4

5 に答える 5

6

私が知る限り、「アクティブ」という用語はよく使われているようですが、定義されていません。ThreadGroup.enumerate()メソッドは次のように文書化されています。

このスレッド グループとそのサブグループ内のすべてのアクティブなスレッドを、指定された配列にコピーします。

this のソースを見ると、メソッドがチェックThread.isAlive()され、それらが列挙可能に追加されます。このことから、「アクティブ」と「アライブ」という用語は交換可能であり、「アライブ」は次のように定義されると推測します。

スレッドが開始され、まだ終了していない場合、スレッドは生きています。

于 2012-04-28T02:49:21.230 に答える
2

java.lang.Thread.State を見てください。

他の非 Java システムでは、アクティブは「RUNNABLE」と同等です。コードをアクティブに実行できる場合、タスク/プロセス/スレッドはアクティブです。そうでない場合は中断されます(ブロックなど)。

Stephen C が言ったように、アクティブはここでは Java ではなく英語として使用されています。

于 2012-04-28T13:44:29.020 に答える
1

このコンテキストでは、「アクティブ」とは、コードを実行していることを意味します。非アクティブなスレッド (I/O 呼び出しでブロックされているか、ロックを待っているスレッド) は、CPU に影響を与えることなく (またはわずかに) メモリ リソースのみを消費します。

ただし、実際にはスレッドが何をしているかに依存します。各スレッドが素数を計算するために数値を反復処理している場合、それらは完全に CPU バウンドであり、スループットを最大化するにはコアごとに 1 つだけにする必要があります。HTTP リクエストを作成したり、ファイル I/O を実行したりする場合は、コアごとにかなりの数を用意できます。

結局のところ、スレッドが何をしているかに関係なく、すべてのスレッドを一般的に網羅する包括的なステートメントは、まったく価値がありません。

並行 Java プログラミングのトピックを質の高い方法で扱うには、『 Java Concurrency in Practice』という本を強くお勧めします。

于 2012-04-28T02:31:52.090 に答える
0

「アクティブ」という言葉は、ここでは通常の英語の意味で使用されています。

アクティブという言葉の通常の英語の意味は、「何かをしている」です。したがって、スレッドの「アクティブ」の直感的な意味は、スレッドが実際に実行されているか、実行する準備ができていることです。

この引用の文脈では:

「コアあたり 4 ~ 20 のアクティブなスレッドを持つことは一般的に許容されます」

「アクティブ」という言葉はこれと一貫して使用されていますが、数字については疑問があります。(20はかなり高すぎます、IMO)。

ただし、これは意図的に曖昧な表現であると主張したいと思います。ギブアウェイは、イタチのフレーズ「一般的に受け入れられている」(特定の情報源を引用するのではなく)の使用と、幅広い範囲(「4〜20」)です。したがって、「アクティブ」という言葉は、意図的なあいまいさのもう 1 つの例であると主張できます。

IMO、引用の著者は、「スレッドが多すぎるのは悪い」という一般的な指摘をしようとしています...「多すぎる」とは何かについて正確に説明することはありません。彼の言う「能動的」に縛り付けて、より的確な導きを引き出すのは無意味だ。(そして明確にするために、「多すぎる」の数を言う ことはできません...一般的に。)

于 2012-04-28T03:03:28.017 に答える
0

「コアあたり 4 ~ 20 のアクティブなスレッドを持つことは、一般的に許容されます」。– アダム・タノン

この意味で、この言葉は「生きている」やその他の可能な意味ではなく、「走る準備ができている」という意味だと思います。待機中のスレッドの値を取得せず、スケジューリングとコンテキスト スイッチのオーバーヘッドに寄与するため、レディ キューに少数のスレッドしか持たないことは理にかなっています。一方、すぐに実行できるスレッドがコアよりも少ない場合は、利用可能なリソースを活用していません。

于 2012-04-28T15:07:10.927 に答える