これはJavaの複製ではなく、同期されたメソッドを使用したマルチスレッド化です...彼は同じ質問をしませんでした。
マルチスレッドとデッドロックを使用するプログラムを作成しようとしています。同期されたメソッドでwait()とnotify()を使用してスレッドを待機させ、notify()でウェイクアップする方法と場所を理解するのに問題があります。pingステートメントの後に最初のスレッドを待機させて、次のスレッドもpingステートメントを開始するようにします。しかし、最初のスレッドをウェイクアップするためのnotify()があり、スレッドがウェイクアップしない理由がわかりません。以下は私の出力であると思われます:
Starting...1
Girl (ping): pinging Boy
Boy (ping): pinging Girl
Girl (ping): asking Boy to confirm
Boy (confirm): confirm to Girl
Girl (ping): got confirmation
Boy (ping): asking Girl to confirm
Girl (confirm): confirm to Boy
Boy (ping): got confirmation
コードがデッドロックしているか、ここで停止するため、待機と通知を正しく使用していません。
Starting...1
Girl (ping): pinging Boy
Boy (ping): pinging Girl
Girl (ping): asking Boy to confirm
Boy (confirm): confirm to Girl
Girl (ping): got confirmation
これが私のコードです:
Monitor.java
class Monitor {
String name;
public Monitor (String name) { this.name = name; }
public String getName() { return this.name; }
public synchronized void ping (Monitor p) {
p.release(p);
System.out.println(this.name + " (ping): pinging " + p.getName());
notify();
try { wait(); } catch (Exception e) {}
System.out.println(this.name + " (ping): asking " + p.getName() + " to confirm");
p.confirm(p);
System.out.println(this.name + " (ping): got confirmation");
}
public synchronized void confirm (Monitor p) {
System.out.println(this.name + " (confirm): confirm to " + p.getName());
}
public synchronized void release (Monitor p) {
notify();
}
}
Runner.java
public class Runner extends Thread {
Monitor m1, m2;
public Runner (Monitor m1, Monitor m2) {
this.m1 = m1;
this.m2 = m2;
}
public void run () {
m1.ping(m2);
}
}
Deadlock.java
public class DeadLock {
public static void main (String args[]) {
int i=1;
System.out.println("Starting..."+(i++));
Monitor a = new Monitor("Girl");
Monitor b = new Monitor("Boy");
(new Runner(a, b)).start();
(new Runner(b, a)).start();
}
}