私はJavaのスレッドの通信をwait()のnotify()で学習し、いくつかのばかげたことが起こります:
ここには、人間を設定して、 、結果は(ジャック・オス、メアリー女性、ジャックオス、メアリーの女性......)ここ
が私のコードであることを意味している:私はHumanDemoを実行するとなぜ私のJava同期メソッドでこの間違いが起こっていますか?
class Human {
private String name;
private String sex;
private boolean b = false;
public synchronized void set(String name, String sex) {
if (b) {
try {
this.wait();
} catch (InterruptedException e) {}
}
this.name = name;
this.sex = sex;
b = true;
this.notify();
}
public synchronized void get() {
if (!b) {
try {
this.wait();
} catch (InterruptedException e) {}
}
System.out.println(name+" "+sex);
b = false;
this.notify();
}
}
class SetHuman implements Runnable {
private Human h;
SetHuman(Human h) {
this.h = h;
}
public void run() {
int x = 0;
while(true) {
if (x==0) {
h.set("Jack","male");
} else {
h.set("Mary","female");
}
x = (x+1)%2;
}
}
}
class GetHuman implements Runnable {
private Human h;
GetHuman(Human h) {
this.h = h;
}
public void run() {
while (true) {
h.get();
}
}
}
class HumanDemo {
public static void main(String[]args) {
Human h = new Human();
SetHuman sh = new SetHuman(h);
GetHuman gh = new GetHuman(h);
Thread t1 = new Thread(sh);
Thread t2 = new Thread(gh);
t1.start();
t2.start();
}
}
、それが働いた:result
次に、私の同期関数set()とget()にelse判定を追加して、このことがうまくいった:
public synchronized void set(String name, String sex) {
if (b) {
try {
this.wait();
} catch (InterruptedException e) {}
} else {
this.name = name;
this.sex = sex;
b = true;
this.notify();
}
}
public synchronized void get() {
if (!b) {
try {
this.wait();
} catch (InterruptedException e) {}
} else {
System.out.println(name+" "+sex);
b = false;
this.notify();
}
}
これはなぜでしょうか?誰でも私に教えてください?ありがとう^ - ^!
イメージを使用せずに問題を説明できますか?これはわかりません – AxelH
ああ、申し訳ありませんが、私はこれらの2人の人間を1人で(ジャック男性、メア女性、ジャック男性、メアリー女性....)印刷する必要があることを意味する最初のものは働いたが、私は他の判断を追加した後、同期メソッドに問題があり、同期されません。 –