java生产者消费者程序实现   线程

源代码在线查看: shop.java

软件大小: 11 K
上传用户: wanjunsheng
关键词: java 程序 线程
下载地址: 免注册下载 普通下载 VIP

相关代码

				
				 public class Shop 		              //定义一个商店类
				   {
				    private int breadNumber;	        	//面包的数量,作为临界资源
					private int breadMaxSize;              //商店里能存放面包的最大容量的个数
					public int numberInWaitingPool;       //shop对象的等待池中等待者的数量
					public Shop(int breadMaxSize)    //定义构造函数
					{
					  this.breadMaxSize=breadMaxSize;
					}
					public synchronized void makeBread()   //"生产面包"操作,对临界资源的访问
					{
					   while (breadNumber==breadMaxSize)		//商店中的面包已满
					   {
						try {
							try{
					 			Thread.sleep(2000);
					 		}
					 		catch(InterruptedException e)
					 		{
					 		} 
							System.out.print(  Thread.currentThread().getName()+"又想做新的面包...但是商店不能再放更多的面包了...所以");
							System.out.println( Thread.currentThread().getName()+"被送入shop对象的等待池中.\n");
							this.numberInWaitingPool++;
							try{
					 			Thread.sleep(2000);
					 		}
					 		catch(InterruptedException e)
					 		{
					 		} 
							this.wait();     //当前线程进入等待状态(即挂起状态)
							} 
					 	catch (InterruptedException e) {}
				   		 }
						this.breadNumber++;				//商店中面还能放面包,生产面包,则面包数量加1
						try{
					 			Thread.sleep(2000);
					 		}
					 		catch(InterruptedException e)
					 		{
					 		} 
						System.out.print("  商店还有"+this.breadNumber+"个面包.");
						
						if (this.numberInWaitingPool>0)	//等待池中有处于等待状态的线程
						{
							this.notifyAll();			//随机从shop对象的等待池中唤醒一个线程
							
							System.out.print("(商店里面又有面包了,所以从shop对象的等待队列中走出一个线程),");
							this.numberInWaitingPool--;	//等待池中线程数量减1
				     	}
					}
						public synchronized void eatBread()   //"吃面包"操作,对临界资源的访问
						{
						while(breadNumber==0){			//商店中已经没有面包了
						try {	
						  try{
					 			Thread.sleep(2000);
					 	   	}
					 		catch(InterruptedException e)
					 		{
					 		} 
					    	System.out.print( Thread.currentThread().getName()+"又来吃了...但是商店已经没有面包了...所以");
						    System.out.println(Thread.currentThread().getName()+"被送入shop对象的等待池中.");
						    this.numberInWaitingPool++;
						    this.wait();    //当前线程进入等待状态,即挂起状态
						} 
						catch (InterruptedException e) {}
						}
						this.breadNumber--;				//商店中若有面包,吃了一块面包后,则其数量减1
						try{
					 			Thread.sleep(2000);
					 		}
					 		catch(InterruptedException e)
					 		{
					 		} 
						System.out.print("  商店还有"+this.breadNumber+"个面包.");
						
						if (this.numberInWaitingPool>0)		//等待池中有处于等待状态的线程
						{
							
							this.notifyAll();				//随机从shop对象的等待池中唤醒一个线程
							System.out.print("(商店中空间有富余了.从shop对象的等待池中走出一个线程),");
							this.numberInWaitingPool--;		//等待池中现成数量减1
						}
					}
				}
							

相关资源