为了账号安全,请及时绑定邮箱和手机立即绑定

多线程唤醒问题

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就不行


正在回答

举报

0/150
提交
取消

多线程唤醒问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信