首页 > 代码库 > 线程的生产者消费者复习

线程的生产者消费者复习

采用JAVA多线程技术,设计实现一个符合生产者和消费者问题的程序:对一个枪膛进行操作,其最大容量是12颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。

public class ShengChanZheXiaoFeiZhe {

	public static void main(String[] args) {
		Container c = new Container();
		BulletProducer producer = new BulletProducer(c);
		BulletConcumer consumer = new BulletConcumer(c);
		Thread t1 = new Thread(producer);
		Thread t2 = new Thread(consumer);
		t1.start();
		t2.start();
	}

}
//子弹类,id为序号
class Bullet{
	int id;
	Bullet(int id){
		this.id = id;
	}
	//重写toString方法,便于显示子弹序号。
	@Override
	public String toString() {
		return "第"+id+"个子弹";
	}
}
//装子弹的容器,具备一定空间,含有装子弹和发子弹的同步方法(是一个栈),方法需要判断栈的空和满,并使用等待唤醒机制控制。
class Container{
	Bullet[] arr = new Bullet[12];
	int index = 0;
	public synchronized void push(Bullet bullet){
		while(index==arr.length){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notify();
		arr[index] = bullet;
		index++;
	}
	public synchronized Bullet pop(){
		while(index==0){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notify();
		index--;
		return arr[index];
	}
}
//生产者,需要被一个线程执行故实现runnable接口,run方法中初始化子弹容器,不断建立子弹对象并向容器中push,并输出子弹序号。
class BulletProducer implements Runnable{
	Container c = null;
	public BulletProducer(Container c) {
		this.c = c;
	}
	public void run(){
		int i = 0;
		while(true){
			Bullet bullet = new Bullet(++i);
			c.push(bullet);
			System.out.println("上膛"+bullet);
		}
	}
}
//消费者,也实现了runnable,建立容器,不断从容器中pop子弹,并输出子弹序号。
class BulletConcumer implements Runnable{
	Container c = null;
	public BulletConcumer(Container c) {
		this.c = c;
	}
	public void run(){
		while(true){
			Bullet bullet = c.pop();
			System.out.println("->->->->->->发射"+bullet);
		}
	}
}


线程的生产者消费者复习