7

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

では、Java でスレッドをスケジュールするにはどうすればよいでしょうか。複数のスレッドの実行準備が整うと、ランタイム システムはRunnable実行の優先順位が最も高いスレッドを選択します。優先順位が同じ 2 つのスレッドが CPU を待機している場合、スケジューラはそのうちの 1 つを選択してラウンドロビン方式で実行します。RR が不要な場合はどうすればよいですか? それを変更する方法はありますか、それともここで何か不足していますか?

4

5 に答える 5

3

過去 10 年ほどの間、JVM スレッドはシステム レベルのスレッドであり、ユーザー レベル (「グリーン」) のスレッドではありません。ユーザーレベルのスレッドであっても、それらを管理することはできません (JVM が行います)。

于 2013-07-24T07:19:35.660 に答える
1

JVM 仕様には、スレッドが実装によってどのようにスケジュールされると想定されているかが記載されていません。Hotspot VM (およびおそらく他のほぼすべての実装) は、OS のスケジューリング メカニズムを使用します (Uwe が述べたように)。「 JVM スケジューリング アルゴリズムとは」も参照してください。.

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

より複雑な (プラットフォームに依存しない) のは、OS スケジューラ自体を JVM のニーズにより合わせたものに変更することです。Google で簡単に調査したところ、この抄録が見つかりました。この分野では、さらに多くの作業が行われていると思います。

于 2013-07-24T09:16:03.737 に答える
0

バッチ ジョブのQuartz ジョブ スケジューラに似た、独自のスレッド スケジューラを作成できます。

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

スレッドの実行順序を決定することだけが必要な場合は、1 つのマスター スレッドからコードを実行します。

于 2013-07-24T10:33:15.610 に答える