2
Javaでwait()とnotify()メカニズムを使用してマルチスレッドについて学習しました。 しかし、私は非常に単純なマルチスレッドJavaアプリケーションの出力に不思議です。以下 コード:マルチスレッドJavaアプリouputデバッグツールの「停止」ボタンをクリックすると奇妙な結果が発生するNetbeans
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 を持っているのはなぜ
重複して出力ライン:は "プット:13177"
我々が持っているのはなぜ2 重複出力ライン:は "得た:2713"を別の時間に。
この結果は私を混乱させます!身体によってはこの問題を理解するのに役立つことがあります!! ありがとうございます。
割り込みが 'valueSet'が変更されたことを保証しないので' while(!valueSet) 'の代わりに' if'を待つべきです。しかし、それはあなたの問題ではありません。おそらく、いくつかの副作用を引き起こす停止ボタンと関連しているでしょう。 – zapl