2

wait() および notify() メカニズムを使用して、Java のマルチスレッドについて学びました。しかし、単純なマルチスレッド Java アプリの出力には非常に興味があります。 以下のコード:

class Q {

    int n;
    boolean valueSet = false;

    synchronized int get() {
        if (!valueSet) {
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("InterruptedException caught");
            }
        }
        System.out.println("Got: " + n);
        valueSet = false;
        notify();
        return n;
    }

    synchronized void put(int n) {
        if (valueSet) {
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("InterruptedException caught");
            }
        }
        this.n = n;
        valueSet = true;
        System.out.println("Put: " + n);
        notify();
    }
}

class Producer implements Runnable {

    Q q;

    Producer(Q q) {
        this.q = q;
        new Thread(this, "Producer").start();
    }

    public void run() {
        int i = 0;
        while (true) {
            q.put(i++);
        }
    }
}

class Consumer implements Runnable {

    Q q;

    Consumer(Q q) {
        this.q = q;
        new Thread(this, "Consumer").start();
    }

    public void run() {
        while (true) {
            q.get();
        }
    }
}

class PCFixed {

    public static void main(String args[]) {
        Q q = new Q();
        new Producer(q);
        new Consumer(q);
        System.out.println("Press Control-C to stop.");
    }
}

最初に、そのアプリを実行した後、デバッグツールの「停止」ボタンをクリックしてアプリを停止します。そして、それは2つの「奇妙なタイプの出力」を作ります: これは、初めてアプリを実行したときの出力です:

2 つの重複した出力行がある理由:***

2 つの重複した出力行がある理由:*** これは、2 回目のアプリ実行の出力です。

2 つの重複した出力行がある理由: "put: 13177"

別の時点で「got: 2713」という2つの出力行が重複している理由。

その結果は私を混乱させます!! 誰かがこの問題を理解するのを手伝ってくれます!! よろしくお願いします。

4

1 に答える 1

0

メソッドQ.put(13177)が 2 回呼び出されています。

于 2012-04-28T23:03:14.717 に答える