0
public class Test {
    private static void funct(final int i) {
        new Thread(new Runnable() {
            public void run() {System.out.println(i);}
         }).start(); 
    }
    public static void main(String[] args) {
        System.out.println(1);
        funct (2);
        System.out.println(3);
        funct (4);
        System.out.println(5);
    }
}

実行するたびに、次のいずれかの解決策が得られます。なぜそうなのか?1 3 5 4 2

1 3 5 2 4

1 3 2 5 4

4

4 に答える 4

4

この例では、番号が出力される順序は不確定です。確かに知っているのは、1、3、5がこの順序で表示されることだけです。しかし、この配置で2と4がどこに来るのかは不明です。この理由は、次の番号シリーズを出力する3つのスレッドがあるためです。(1、3、5); (2)、および(4)。3つのスレッドはJVMによってスケジュールされますが、JVMが最適であると判断します。

マルチスレッドプログラミングは複雑なトピックであり、あなたはそれに飛び込み始めたばかりのように見えるので、OracleのJavaチュートリアルの同時実行部分をお勧めします:http://download.oracle.com/javase/tutorial/essential/concurrency/index .html

于 2011-04-13T04:18:39.613 に答える
1

これは、どのスレッドが最初に生成されるかを制御できないためです。これはJVMによって決定されます。メインから実行されるため、「1,3,5」のみが順番に表示されます。

この質問は関連している可能性があります:-

  1. 特定の時間にJavaスレッドを実行する
于 2011-04-13T04:18:30.223 に答える
1

メインスレッドが他の2つのスレッドよりも優れている場合があるためです。他の時はそうではありません。

3つのスレッドがあります。特定の順序で実行するようにスケジュールされる保証はありません。

于 2011-04-13T04:20:40.917 に答える
1

スレッド化と非同期性は一般に複雑なトピックですが、あなたの場合、スレッドはスピンアップするのに少し時間がかかるため、JVMのプロセッサ時間の種類に応じて他のprintステートメントとインターリーブします(次に、OS)はそれらのスレッドに割り当てることを決定します。

何が起こっているのかを本当にしっかりと把握したいのであれば、BrianGoetzらによる本JavaConcurrencyinPracticeを強くお勧めします。

于 2011-04-13T04:20:52.820 に答える