2013-07-24 4 views
5

Javaスレッドはユーザーレベルのスレッドであり、ユーザーレベルのスレッドとカーネルレベルのスレッドの違いの1つは、カーネルレベルのスレッドがカーネルによってスケジューリングされるということですユーザーレベルのスレッドでは、独自のスケジューリングアルゴリズムを定義できます。Javaスレッドをスケジューリングする方法

Javaでスレッドをスケジュールするにはどうすればよいですか?ある時点で、複数のスレッドが実行可能な状態になると、ランタイムシステムは実行のために最も高い優先順位を持つRunnableスレッドを選択する。同じ優先度の2つのスレッドがCPUを待っている場合、スケジューラはそれらの1つをラウンドロビン方式で実行するように選択します。もし私がRRを望まないなら、どうしますか?私はそれを変更する方法があるのですか、ここで何かを逃していますか?

+3

このような低レベルのJVM設定を変更しようとするのは、通常は非常に悪い考えです。スレッドの実行順序を変更して解決しようとしている問題は何ですか? – ssindelar

答えて

8

スケジューリングアルゴリズムを変更することはできませんが、JVMの場合は範囲​​外です。 JVMは、基盤となるOSによって提供されるユーザースレッドのスレッドを使用します。

Javaの観点からは、スケジューリングアルゴリズムを変更することはできません。スケジューリングは自動的に行われます。

Javaの唯一のことは、set the priority of the threadです。しかし、これがどのようにスケジューリングアルゴリズムに影響するかは定義されていません

VMが動作しているOSのスケジューリングアルゴリズムを変更することができます。しかし、これは使用されるOSに大きく依存します。

2

JVMスレッドは、システムレベルのスレッドであり、ユーザーレベル(「緑色」)のスレッドではありません。ユーザレベルのスレッドであっても、それらを管理することはできません(JVMはそうします)。

1

JVM仕様では、スレッドが実装によってどのようにスケジューリングされることになっているかについては述べていません。ホットスポットVM(ほとんどすべての他の実装でも同様)は、OSスケジューリングメカニズムを使用しています(Uweが述べたように)。 What is the JVM Scheduling algorithm?も参照してください。

アプリケーションスレッドのスケジューリングに影響する非常に効率的でない方法は、OSがスケジュールするn個の実行可能スレッドのみを持つことです(nは、並列で実際に実行したいスレッドの数です)。 独自のExecutorServiceの実装です。OSによってスケジュールされたくないスレッドは、実行する必要があると思うまで待機します。 もちろん、他のアプリケーションやOSはもちろんのこと、他のVMスレッドに影響を与えることはありません。

OSのスケジューラ自体をJVMのニーズに合わせて変更することが、より多く関わっています(plattformに依存しない)。素早くGoogleの調査でthis abstractが見つかりました。

0

有効なJavaの第2版では、Joshua Blochがスレッドスケジューリングの議論に力を入れています。彼は、スレッドスケジューリングを調整しようとすると、通常、JVMの実装に依存し、移植性がなく、壊れやすいソリューションにしか導かれません。

スケジューリングに問題がある場合は、新しいコードでは、とにかく低レベルのスレッド呼び出しを処理しないでください。 Javaには、これらのタスクの多くを単純化する、より高度な並行性ライブラリがあります。スレッドの問題に対する解決策を定義するのではなく、実行者とタスクを考えるべきです。 CountDownLatchなどのスレッド間通信を単純化する上位レベルの機能もあります。

wait、notify、notifyAllなどの低レベルのスレッド呼び出しは、適切に行うのが難しい場合があります。

0

バッチジョブの場合は、Quartz job schedulerと同様の独自のスレッドスケジューラを作成できます。

これにより、アプリケーションの実行中にさまざまな時刻にスレッドを実行できます。

スレッド実行の順序を決定したい場合は、1つのマスタースレッドからコードを実行します。

関連する問題