多线程唤醒问题
public class FlagWork { public static void main(String[] args) { final Business1 b1 = new Business1(); new Thread(new Runnable() { @Override public void run() { b1.a(); } }).start(); new Thread(new Runnable() { @Override public void run() { b1.b(); } }).start(); new Thread(new Runnable() { @Override public void run() { b1.c(); } }).start(); } } class Business1 { private int flag = 1; public void a() { for (int i = 0; i < 50; i++) { synchronized (this) { while (flag != 1) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("线程a运行" + j + "次"); } flag = 2; this.notify(); } } } public void b() { for (int i = 0; i < 50; i++) { synchronized (this) { while (flag != 2) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 20; j++) { System.out.println("线程b运行" + j + "次"); } flag = 3; this.notify(); } } } public void c() { for (int i = 0; i < 50; i++) { synchronized(this){ while(flag!=3){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 30; j++) { System.out.println("线程c运行"+j+"次"); } flag = 1; this.notifyAll(); } } } }
A线程先运行10次,然后B线程运行20次,然后C线程运行30次,如此反复50次的代码,为什么次c方法里要用this.notifyAll,而用this.notify就不行