Java 多线程例子10 线程之间通信 wait notify notifyAll

回答问题:http://www.iteye.com/problems/46763

有三方:厂家,电脑城,顾客
厂家2个,一个生产主板,一个生产显卡。
顾客有2个,他们各自不断购买主板和显卡。
电脑城有一个,卖显卡和主板。

 

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
				try {VIDEO.wait();} catch (Exception e) {}   
			}
			System.out.println("ComputerCenter: 厂商送来一块显卡。");
			videoN++;
			VIDEO.notify();//----------------------------唤醒消费者消费
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
				try {MAINB.wait();} catch (Exception e) {}      
			}
			System.out.println("ComputerCenter: 厂商送来一块主板。");
			MainbN++;
			MAINB.notify();//-----------------------------唤醒消费者消费
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			System.out.println(name + " : 买走一块显卡。");
			videoN--;
			VIDEO.notify();//----------------------------------唤醒厂商
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {  
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
			System.out.println(name + " : 买走一块主板。");
			MainbN--;
			MAINB.notify();//----------------------------------唤醒厂商
		}
	}


	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 上面的程序,没有考虑到,顾客a和顾客b可以相互叫醒,导致卖出的数量是负值了。

改进,等待进入后再判断。

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
				try {VIDEO.wait();} catch (Exception e) {}   
			}
			videoN++;
			System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN);
			VIDEO.notify();//----------------------------唤醒消费者消费
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
				try {MAINB.wait();} catch (Exception e) {}      
			}
			MainbN++;
			System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN);
			MAINB.notify();//-----------------------------唤醒消费者消费
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			if(videoN >0) {
				System.out.println(name + " : 买走一块显卡。"+videoN);
				videoN--;
			}
			VIDEO.notify();//----------------------------------唤醒厂商
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
			if(MainbN >0) {
				System.out.println(name + " : 买走一块主板。"+MainbN);
				MainbN--;
			}
			MAINB.notify();//----------------------------------唤醒厂商
		}
	}

	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 网友说了,这种卖电脑的叫人家来了,又可能买不到的情况存在。

class ComputerCenter {
	private static Object VIDEO = new Object();
	private static Object MAINB = new Object();
	private static Integer videoN = 10;
	private static Integer MainbN = 10;

	public void stockVd() {
		synchronized(VIDEO) {
			if(videoN >= 20) {
				System.out.println("ComputerCenter: the VC storage is MAX");   
			} else {
				videoN++;
				System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN);
				VIDEO.notify();//----------------------------唤醒消费者消费
			}
		}
	}

	public void stockMd() {
		synchronized(MAINB) {
			if(MainbN >= 20) {
				System.out.println("ComputerCenter: the MB storage is MAX");   
			} else {
				MainbN++;
				System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN);
				MAINB.notify();//-----------------------------唤醒消费者消费
			}
		}
	}

	public void sellVd(String name) {   
		synchronized(VIDEO) {
			if(videoN <= 0) {
				System.out.println("没有显卡了,等等,马上送来!!!!!!!!!");   
				try {VIDEO.wait();} catch (Exception e) {}    
			}
			System.out.println(name + " : 买走一块显卡。"+videoN);
			videoN--;
		}
	}
	
	public void sellMd(String name)  {
		synchronized(MAINB) {
			if(MainbN <= 0) {
				System.out.println("没有主板了,等等,马上送来!!!!!!!!!!");   
				try {MAINB.wait();} catch (Exception e) {} 
			}
				System.out.println(name + " : 买走一块主板。"+MainbN);
				MainbN--;
		}
	}

	public static void main(String[] args) {
		ComputerCenter MyCC = new ComputerCenter();   
		new customer(MyCC,"Jack").start();
		new customer(MyCC,"Tom").start();  
		new Md_retailer(MyCC).start();
		new Vd_retailer(MyCC).start();
	}
}

class customer extends Thread {
	private ComputerCenter cc;
	private String name;
	public customer(ComputerCenter cc,String name) {
		this.cc = cc;
		this.name = name;
	}

	public void run() {
		while(true) {
			//try {Thread.sleep(10);} catch (Exception e) {}      
			//顾客不断购买显卡和主板   
			cc.sellVd(name);	cc.sellMd(name);
		}
	}  
}
class Md_retailer extends Thread {
	private ComputerCenter cc;
	public Md_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockMd();
		}
	}  
}
class Vd_retailer extends Thread {
	private ComputerCenter cc;
	public Vd_retailer(ComputerCenter cc) {
		this.cc = cc;
	}

	public void run() {
		while(true) {
			try {Thread.sleep(10);} catch (Exception e) {}      
			cc.stockVd();
		}
	}  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值