5

OS のスケジューリング/スレッド化アルゴリズムが Java スレッドに影響を与えることは明らかですが、

スレッドは OS/マシンに依存していると安全に言えますか?

この場合、Java プラットフォームに依存しませんか?

4

3 に答える 3

7

はい、Java でのスレッドのスケジューリングの詳細は、JVM の実装と (通常は) OS の実装にも依存します。

しかし、そのスケジューリングの詳細も Java SE 仕様では指定されておらず、選択されたいくつかの基本ルールのみが指定されています。

これは、OS 固有のスケジューリングがこれらの基本ルールに準拠している限り、JVM 仕様にも準拠していることを意味します。

コードがJVM 仕様で指定されていないスケジューリングの詳細に依存している場合、それは実装の詳細に依存しており、どこでも機能するとは期待できません。

これは、ファイル I/O とほぼ同じ状況です。パスをハードコーディングし、固定のディレクトリ セパレータを使用すると、仕様外で作業していることになり、コードがクロスプラットフォームで動作することを期待できなくなります。

編集:もちろん、 JVM実装自体 (つまり、JRE)プラットフォームに依存します。これは、純粋な Java プログラムがプラットフォームの詳細を気にしないようにするレイヤーを提供します。これを実現するには、JREpaltform 固有にする必要があります。

于 2012-11-05T09:57:09.503 に答える
3

... Java は通常、ネイティブ スレッドを使用しますが、一部のオペレーティング システムでは、いわゆる「グリーン スレッド」を使用します。これは、JVM 自体が処理し、単一のネイティブ スレッドによって実行されます。

これについて心配する必要はありません。これはすべて JVM によって処理され、プログラマには見えません。私が考えることができる唯一の実際の違いは、グリーン スレッドを使用する実装では、マルチスレッドの分割統治アルゴリズムによるパフォーマンスの向上はないということです。ただし、ネイティブ スレッドを使用するがシングル コアのマシン上で実行される実装についても、同じようにパフォーマンスが向上しません。

JVM & Java Threads Schedulingからの抜粋

于 2012-11-05T09:56:56.447 に答える
3

同じプラットフォームでも、安全でないマルチスレッド コードを記述した場合、動作は完全な構成の詳細、残りのマシン負荷、および多くの運、さらにはハードウェアと OS に依存する可能性があります。安全でないプログラムは、ある日は正常に動作しているように見えても、同じハードウェア上で多かれ少なかれ同じワークロードで次の日に失敗する可能性があります。

安全なマルチスレッド コード (Java 言語仕様とライブラリ API で約束されていることのみに依存するコード) を作成する場合、プラットフォームの選択はもちろんパフォーマンスに影響しますが、機能的に動作するかどうかには影響しません。

于 2012-11-05T10:16:03.700 に答える