⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample16_9.java

📁 Java SE 6.0前12-16章示的示例代码,简单易学
💻 JAVA
字号:
package wyf.jc;
//面包容器(资源)
class BreadContainer
{
	//容器的最大容量
	public static final int maxNum=300;
	//当前面包的数量
	private int num;
	//无参构造器
	public BreadContainer()
	{	}
	//有参构造器
	public BreadContainer(int num)
	{
		//初始化面包数量
		this.num=num;
	} 
	//制作面包的同步方法
	public synchronized void produceBread(int produceNum,String producerName)
	{
		//测试是否可以生产面包
		while(num+produceNum>maxNum)
		{
			//面包充足,生产者等待
			System.out.println(producerName+"要生产"+produceNum+"个,当前"
			+num+"个,资源充足,不需要生产,"+producerName+"去等待!");
			try
			{
				wait();
			}
			catch(Exception e)
			{	
			    e.printStackTrace();
			}
		}
		//满足条件后,生产者生产面包,刷新数量
		num=num+produceNum;
		System.out.println(producerName+"生产了"
						+produceNum+"个,现在有"+num+"个。");
		//唤醒资源等待池中的所有线程
		notifyAll();
	}
	public synchronized void consumeBread(int consumeNum,String consumerName)
	{
		//测试面包数量是否够消费
		while(consumeNum>num)
		{
			//不够数量,消费者等待
			System.out.println(consumerName+"要消费"+consumeNum+
				"个,由于现在只有"+num+"个,"+consumerName+"于是去等待!");
			try
			{
				wait();
			}
			catch(Exception e)
			{	
			    e.printStackTrace();
			}
		}
		//数量充足,消费面包,刷新数量
		num=num-consumeNum;
		System.out.println(consumerName+"消费了"
		      +consumeNum+"个,现在还剩下"+num+"个");
		//唤醒资源等待池中的所有线程
		this.notifyAll();
	}
}
//生产者类
class Producer extends Thread
{
	//记录该生产者一次生产的数量
	private int produceNum;
	//生产者需要访问的面包容器资源
	private BreadContainer bc;
	//无参构造器
	public Producer()
	{	}
	//有参构造器
	public Producer(int produceNum,BreadContainer bc,String producerName)
	{
		//对线程进行初始化
		this.produceNum=produceNum;
		this.bc=bc;
		this.setName(producerName);
	}
	//生产者的工作方法
	public void run()
	{
		//调用资源容器的同步方法生产资源
		bc.produceBread(produceNum,this.getName());
	}	
}
//消费者类
class Consumer extends Thread
{
	//记录该消费者一次消费的数量
	private int consumeNum;
	//消费者需要访问的面包容器资源
	private BreadContainer bc;
	//无参构造器
	public Consumer()
	{	}
	//有参构造器
	public Consumer(int consumeNum,BreadContainer bc,String consumerName)
	{
		//对线程进行初始化
		this.consumeNum=consumeNum;
		this.bc=bc;
		this.setName(consumerName);
	}	
	//消费者的行为方法
	public void run()
	{
        //调用资源容器的同步方法生产资源
		bc.consumeBread(consumeNum,this.getName());
	}
}
public class Sample16_9
{
	public static void main(String args[])
	{
		//创建资源对象,初始面包有50个
		BreadContainer bc=new BreadContainer(50);
		//创建对应的生产者和消费者
		Producer p1=new Producer(50,bc,"P1");
		Producer p2=new Producer(200,bc,"P2");
		Producer p3=new Producer(290,bc,"P3");
		Consumer c1=new Consumer(70,bc,"c1");
		Consumer c2=new Consumer(80,bc,"c2");
		//启动生产者消费者线程
		c1.start();
		c2.start();
		p1.start();
		p3.start();
		p2.start();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -