以下のスレッドのコードで、waitメソッドを呼び出した後に、notifyメソッドを呼び出しても、停止したスレッドが再開されておりません。
waitメソッドをThread2で呼び出し、別のスレッドThread1でnotifyメソッドを呼び出しているので、停止していた処理が再開するという想定でした。
このようになった原因をご教示願いたいです。
■実行結果
wait開始
notify開始
notify終了
push
Java
1public class Stack { 2 private boolean flag = false; 3 synchronized public void push() { 4 System.out.println("notify開始"); 5 notify(); 6 System.out.println("notify終了"); 7 if(flag) { 8 try { 9 wait(); 10 }catch(InterruptedException e) { 11 System.out.println("push例外"); 12 } 13 } 14 flag = true; 15 System.out.println("push"); 16 } 17 18 synchronized public void pop() { 19 if(!flag) { 20 try { 21 System.out.println("wait開始"); 22 wait(); 23 System.out.println("wait終了"); 24 }catch(InterruptedException e) { 25 System.out.println("pop例外"); 26 } 27 } 28 System.out.println("pop "); 29 } 30} 31
Java
1public class Main{ 2 3 public static void main(String[] args) throws InterruptedException { 4 5 Thread1 thread1 = new Thread1(); 6 Thread2 thread2 = new Thread2(); 7 thread1.start(); 8 thread2.start(); 9 10 } 11} 12 13class Thread1 extends Thread{ 14 public void run() { 15 new Stack().push(); 16 } 17} 18class Thread2 extends Thread{ 19 public void run() { 20 new Stack().pop(); 21 } 22} 23
■Mainクラス修正後
Java
1public class Main{ 2 3 public static void main(String[] args) throws InterruptedException { 4 Stack stack = new Stack(); 5 Thread1 thread1 = new Thread1(stack); 6 Thread2 thread2 = new Thread2(stack); 7 thread1.start(); 8 thread2.start(); 9 10 } 11} 12 13class Thread1 extends Thread{ 14 Stack stack = null; 15 16 public Thread1(Stack stack) { 17 this.stack = stack; 18 } 19 20 public void run() { 21 stack.push(); 22 } 23} 24class Thread2 extends Thread{ 25 Stack stack = null; 26 public Thread2(Stack stack) { 27 this.stack = stack; 28 } 29 30 public void run() { 31 stack.pop(); 32 } 33} 34
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 08:29 編集
2020/04/12 16:15
2020/04/13 11:11