Javaで単純な待機/通知の例を取り組んでいて、何らかの理由で正しく動作させることができませんでした。誰かが何が問題かもしれないかを見ることができれば、非常に感謝しています!Javaコードでnotify()とnotifyAll()がJavaコードで機能しない
class producer implements Runnable {
StringBuffer sb;
producer() {
sb=new StringBuffer("");
}
public void run() {
synchronized(sb) {
for(int i = 0; i < 10; i++) {
try {
sb.append(i+" ");
System.out.println("Appending ... ");
} catch (Exception e) {}
}
sb.notify();
}
}
}
class consumer implements Runnable {
producer p;
consumer(producer pp) {
this.p = pp;
}
public void run() {
System.out.println("Rreached");
synchronized(p.sb) {
try {
p.sb.wait();
} catch (Exception e) {}
System.out.println(p.sb);
}
}
}
class Thread_Comunication {
public static void main (String [] args) {
producer p = new producer();
consumer c = new consumer(p);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
出力:
Appending ...
Rreached // randome Position
Appending ...
Appending ...
Appending ...
Appending ...
Appending ...
Appending ...
Appending ...
Appending ...
Appending ...
ので、いくつかの理由でスレッドt1
はt2
を覚ますか、私は完全に他の何かが欠けていないのですか?
、例外が発生した場合、' 'あなたのcatch'ブロックで特にあなたが知っていることは決してないだろう。だから、
consumer
のような何かを行うことができます。 – Jesper注:Java言語の規約では、クラス名は大文字の名前で始まります(したがって、 'producer'は良いクラス名ではありません)。クラス、メソッド、またはパッケージ名にはアンダースコアが使用されず、すべての資本定数の名前でのみ使用されます。クラスには 'ThreadCommunication'のような名前があり、' Tread_Comunication'ではありません。変数には、 'p'や 'pp'ではなく、意味のある名前を付けることもお勧めします。 – RealSkeptic
投票者を閉じる:コードは少なくともスケジューラの裁量で発生する可能性のある競合状態に依存するため、投稿されたコードは問題を再現します(できるだけ多くの場合)。投稿されたコードと出力との間には、ここで何が起こっているのかを理解することが現実的です。 –