1

O/SCJP 試験の練習をしています。次のコードを検討してください。

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.start();

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}

ソース: http://scjptest.com/mock-test.xhtml

このサイトには、出力 (模擬質問への回答) が表示されるBeginRunEndと記載されており、クラスを正常に実行すると、まさにそれが出力されます。

ただし、デバッグ時の出力はRunBeginEnd.

通常の実行では、出力は常に、または他の要因 (新しいスレッド クラスのさ/スレッドを開始してから参加するのにかかる時間BeginRunEndなど) に応じて変化すると言っても過言ではありませんか?

公正で正確な試験問題だと思いますか?

4

3 に答える 3

3

BeginRunEndはRunBeginEndよりも可能性が高いと思います(新しいスレッドを実際に起動する動作は、runメソッドに到達するまでにしばらく時間がかかり、最初のスレッドがタイムスライスを使い果たす前に印刷に到達することを期待していますほとんどの場合)が、プログラミング時にそれを想定するのは間違いです。

2つのスレッドは、呼び出されるとすぐに完全に独立していると見なす必要があります。これは、2つのスレッドが呼び出しstartで再び明示的に結び付けられるまで続きjoinます。論理的には、メインスレッドが「Begin」を出力する前に、新しいスレッドが完了するまで実行される可能性があります。

私には悪い質問のように見えます。

于 2011-07-29T14:10:59.583 に答える
2

これはゴミの質問です。結果は、同期なしでは定義されません。

これは本当に bofa fida SCJP の質問ですか、それとも SCJP トレーニングを販売しようとしているサイトによって作成されたものですか? 後者の場合、私は疫病のようにそのサイトを避けます.

于 2011-07-29T14:53:14.413 に答える
1

これはプラットフォームに依存する可能性がありますが、順序を示すために変更される可能性があります。

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.setPriority(Thread.MAX_PRIORITY);
        a.start();

        // Thread.sleep(1);

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}

初めて実行したときに印刷されます。

RunBeginEnd

ただし、その後はほとんどがBeginRunEndです。

スレッドが停止すると、1ミリ秒の間でも、ほぼ毎回RunBeginEndが生成されます。

于 2011-07-29T14:20:20.333 に答える