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 つの重複した出力行がある理由: "put: 13177"
別の時点で「got: 2713」という2つの出力行が重複している理由。
その結果は私を混乱させます!! 誰かがこの問題を理解するのを手伝ってくれます!! よろしくお願いします。