2011-10-27 8 views

答えて

10

スケジューラは、通常、OSのスケジューラです。マシン上の他のプロセスが何をしているのか、ハードウェアが何をしているのか(割り込みなど)など、多くの要素の影響を受けます。OSによっては、乱数が含まれることもありますが、それは、複数の可変時間間隔が重なり合う可能性があるという予測不可能な方法です。

0

JVMはOSをOSにスケジューリングし、OSスケジューラがスレッドをスケジューリングするか、JVMがスレッド自体のスケジュールを決定することがあるので、最初の違いは2つのマシンで予測できない動作です同じ状況)は、スレッドがJVMかOSによってスケジュールされているかどうかにかかわらず、本当に確実ではありません..... さらに、要因の数があり、スレッドの優先度は1つの要素です(優先度を設定できます)。もう一つの要因....その乱数が含まれている可能性は低いです。

+0

すべての現在のメインストリームJVMは、スケジューリングを完全にOSに委ねます。いくつかの古いJVMは緑色のスレッドを使用していましたが、その場合は*すべてのスレッドのスケジューリングがJVMによって管理されていました。 –

+0

@MichaelBorgwardt私はJava 6のためのSCJPの本は、この説明を含める必要があると思います。とにかく更新のおかげで – Zohaib

4

スケジューラで乱数を使用すると、OSのクリティカルセクションに不必要なオーバーヘッドが発生するため、少なくともメインストリームOSではそれが原因ではありません。

スレッドは、通常、ブロックするOSコールが発生するか、割り込みが発生するまで、またはタイムスライスが期限切れになるまで実行されます(これは最終的にはタイマ割り込みです)。 2つのスレッドが常に決定論的な順序でブロックするように注意深く構築することができたとしても、後の2つのエフェクトがいつ発生するかを正確に制御することはできません。アプリケーション内のスレッドが実行される順序は、最終的にアプリケーション外のイベントの影響を受けます。

0

最近のオペレーティングシステムでは、Preemtive multitaskingと呼ばれるものが使用されます。これは、システム上の各プロセスにCPU時間のスライスを保証します。それぞれのプロセスを中断し、次のプロセスを中断させるためのさまざまなルールがあります。このため、マシン上にプロセスごとに1つのCPUを必要としません。

これはランダムではありませんが、一般的には予測できません。

1

その他の質問は、技術的な詳細で良い点を作る、しかし:正確には

、Javaでスレッドのスケジューリングがかなり効率的ロックによって制御され、待機/通知/のnotifyAll睡眠方法や他の同時実行制御。 アプリケーション実行中のこれらの時刻に限り、が存在しない場合は、異なるスレッドの実行順序はのままで、定義されていません。

主な理由は、おそらく異なるハードウェア/ OSシステムでのJavaの移植性を容易にするためです。開発者として、上記の並行処理コントロールを使用してアプリ内の異なるスレッドを実行する順序を定義していない場合は、それを気にする必要はなく、任意の方法で問題が発生することはありませんJVMによって選択されます。

関連する問題