-1

マルチスレッド Java プログラムをテストしています。デバッグのために、スレッドにステートメントを出力させました。プリントアウトの順序は次のようになります。

  • スレッド メッセージ 1
  • スレッド メッセージ 2
  • スレッド メッセージ 1
  • スレッド メッセージ 2

問題は、特定のマシンで次のように変更されることです。

  • スレッド メッセージ 1
  • スレッド メッセージ 1
  • スレッド メッセージ 2
  • スレッド メッセージ 2

このマシンには、私がテストした他のすべてのマシンと同じバージョンの Java が搭載されています。以前のものには Windows 7 があったので、最初は Windows 8 の問題だと思いましたが、別の Windows 8 マシンで試してみたところ、正しく動作しました。だから私の質問は、Java でスレッドのスケジューリングに影響を与える他の変数は何ですか? 参考までに、正しくないシーケンスが発生するマシンは、Acer Aspire E1-521-0694 AMD Dual Core E2-1800 with Windows 8 です。

4

5 に答える 5

2

Assuming that Java uses the operating system's threading implementation, there is no defined order in which the threads should run. This is exactly the reason why things like http://en.wikipedia.org/wiki/Race_condition exist.

In fact, I wouldn't be surprised at all if you ran the program 100 times on the exact same machine, and each time the order changed. If you need to ensure that something happens before something else, then you need to add synchronization to your threads (http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html).

It might also be worth noting that more or less the same thing is true whether you're using Java, or using pthreads from C, or whatever. Thread scheduling is generally undefined without some sort of sycnhronization code to force it to happen in a particular way.

于 2013-06-28T21:20:06.840 に答える
0

Sun/Oracle の HotSpot JVM は、Java スレッドをオペレーティング システムのスレッドにマップし、OS がそれらをスケジュールします。優先順位は違いを生む可能性Thread.setPriorityがありますが、保証はありません。

他の人が言ったように、順序付けを強制するには同期メカニズムを使用する必要があります。

于 2013-06-28T23:26:30.970 に答える