0

同期

class bでアクセスされる同期メソッドを持つ を宣言しましたclass c

class b {
    String msg;

    public synchronized void foo() {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000); // Threads go to sleeep

        } catch (InterruptedException e) {
            System.out.println("Caught" + e);
        }
        System.out.println("]");
    }
}

class a implements Runnable {
    b ob;

    Thread t;

    a(String msg, b obb) {
        ob = obb;
        ob.msg = msg;
        t = new Thread(this); // creating a thread
        t.start();
    }

    public void run() {
        ob.foo(); // calling method of class b
    }

    public static void main(String... a) {
        b obb = new b();
        a ob = new a("Hello", obb); /* PASSING */
        a ob1 = new a("Synch", obb); /* THE */
        a ob2 = new a("World", obb);/* MESSAGE */

        try {
            ob.t.join();
            ob1.t.join();
            ob2.t.join();
        } catch (InterruptedException e) {
            System.out.println("Caught" + e);
        }
    }
}

私は出力を期待しています:

[Hello]
[Synch]
[World]

しかし、コードは次のようになります。

[World]
[World]
[World]

いくつかの提案を手伝ってください。私は初心者の Java ユーザーです。

4

3 に答える 3

0

まず、コードを再フォーマットします。とても読みにくいです。2番目に呼び出すob.msg = msg;と、obのmsg値が上書きされ、同期されないため、実際に出力がどうなるかを予測できません。

于 2013-10-11T09:10:40.187 に答える
0

設定したコードではob.msg=msg; msg、スレッドによってオーバーライドされます。したがって、すべてのスレッドに対して同じメッセージが表示されます。

class の各 Thread のコンストラクターで、 classaの同じオブジェクトを渡しますb。これで、3 つのスレッドすべてmsgが class のインスタンスの値を設定していますb。したがって、1 つの値が他の値をオーバーライドします。あなたが持っているのは、最後のスレッドによって設定された値ですWorld

fooIMO: msg を各スレッドのインスタンス変数として保存し、それをパラメーターとしてメソッドに渡します。

そして、Java の命名規則、つまり Camel Casing に従ってください。

于 2013-10-11T09:01:41.797 に答える