2013-04-30 10 views
6

2つのスレッドabを開始するプログラムがあり、bがそれ自身の別の10スレッドを開始するとします。 abとそのスレッドの残りの半数を共有していますが、使用可能な「注意」の半分を受信して​​いるのでしょうか?答えがデフォルトで後者の場合、どのように前者を達成できますか?ありがとう!スレッド内のスレッドの優先順位付け

答えて

2

b、そのスレッドが残りの半分を共有し、またはそれらはすべて平等に共有んがaは、利用可能な「注意」の半分を受けていますか?

どちらもありません。各スレッドが受け取る時間の割合は不特定であり、Javaで制御する信頼できる方法はありません。これは、ネイティブスレッドスケジューラの責任です。

答えが後者の場合、どのように前者を達成できますか?

信頼性の高い方法ではありません。

各スレッドが実行される相対的な時間に影響を与えなければならないのは、スレッドの優先順位だけです。彼らは信頼できるものでも予測可能でもありません。 javadocsは、優先順位の高いスレッドが優先順位の低いスレッドよりも優先して実行されると言うだけです。実際には、ネイティブスレッドスケジューラが優先順位をどのように処理するかによって異なります。

詳細:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/thread-priorities.html ...プラットフォームおよびJavaバージョンの範囲でのスレッドの優先順位についての情報が含まれています。

+0

ダウン投票者 - あなたは説明したいですか? –

5

このトピックに関する素晴らしいドキュメントがたくさんあります。 1つはthisです。

Javaスレッドが作成されると、Javaスレッドはそのスレッドを作成したスレッドからその優先度を継承します。スレッドの優先順位は、作成後のいつでも、setPriority()メソッドを使用して変更することもできます。スレッドの優先順位は、MIN_PRIORITYMAX_PRIORITY(Threadクラスで定義された定数)の間の整数です。整数が大きいほど優先度が高くなります。ある時点で、複数のスレッドが実行可能な状態になると、ランタイムシステムは実行のために最も高い優先順位を持つ「実行可能」スレッドを選択する。そのスレッドが何らかの理由で停止すると、スレッドが停止して「実行不可能」になるときだけ、優先順位の低いスレッドが実行を開始します。同じ優先度の2つのスレッドがCPUを待っている場合、スケジューラはそれらの1つをラウンドロビン方式で実行するように選択します。選択したスレッドは、次のいずれかの条件が満たされるまで実行されます。

  1. 優先度の高いスレッドは "実行可能"になります。
  2. これが発生するか、run()メソッドが終了します。
  3. タイムスライスをサポートするシステムでは、タイムアロケーションの有効期限が切れています。

任意の時点で、最も優先度の高いスレッドが実行されています。ただし、これは保証されません。スレッドスケジューラは、より低い優先度のスレッドを実行して飢餓を回避することを選択することができる。このため、優先度は、効率化の目的でスケジューリングポリシーに影響を与えるためにのみ使用してください。 アルゴリズムの正確さのためにスレッドの優先順位に依存しないでください。

+0

+1、 'アルゴリズムの正当性についてスレッドの優先度に依存しない'。 –

+0

+1古典的な説明 –

0

スレッドが実行される順番を曖昧にすることはできません。スレッドスケジューラは、変更できない組み込みのアルゴリズムに従って動作します。スレッドスケジューラは、実行可能プールからすべてのスレッド(優先度が最も高いスレッド)を取り出して実行させます。 スケジューラがスレッドを処理する優先度についてのみ言及することができます。

関連する問題