Java多线程模拟生产者消费者问题

Java中,为了在A类中操作B类,然后就会传递B类的引用到A类中,然后通过import将B类导入。那如果是在另外一门支持面向对象编程的语言中,比如说PHP中,想要在A类中操作B类,你会怎么做?


import java.util.LinkedList;
import java.util.List;

/**
 * 多线程演示生产者和消费者问题
 */
public class ProducerAndConsumer {
	public static void main(String[] args) {
		Product product = new Product();	//实例化产品对象
		Producer p = new Producer(product);	//实例化一个生产
		Consumer c = new Consumer(product);	//实例化一个消费者
		new Thread(p).start();	//开启生产者线程
		new Thread(c).start();	//开启消费者线程
	}
}

/**
 * 生产者线程
 */
class Producer implements Runnable {
	private Product product;
	
	public Producer(Product product) {
		this.product = product;
	}
	
	@Override
	public void run() {
		while ( true ) {
			//同步代码锁
			synchronized (product) {
				try {
					while ( product.getMax() == product.size() ) {
						//产品栈已经满,不需要再生产,执行线程等待操作
						System.out.println("产品栈已满,生产者休息中......");
						product.wait();
					}
					//产品栈不足,开始生产
					Object newObj = new Object();
					product.add(newObj);
					System.out.println("Producer 生产了一个产品,目前产品栈大小为:"+product.size());
					//生产一个产品之后,线程开始睡眠
					Thread.sleep((long)Math.random() * 3000);
					//通知消费者,有新产品
					product.notify();
				} catch (Exception e) {}
			}
		}
	}
}
/**
 * 消费者线程
 */
class  Consumer implements Runnable{
	private Product product;
	
	public Consumer(Product product) {
		this.product = product;
	}
	
	@Override
	public void run() {
		while ( true ) {
			//同步代码锁
			synchronized (product) {
				try {
					while ( product.size() == 0 ) {
						//产品栈已空,不可以再消费,执行线程等待操作
						System.out.println("产品栈为空,消费者等待中......");
						product.wait();
					}
					//产品栈有商品,开始消费
					product.remove();
					System.out.println("Consumer 消费了一个产品,目前产品栈大小为:"+product.size());
					//消费一个产品之后,线程开始睡眠
					Thread.sleep((long)Math.random() * 3000);
					//通知消费者,有新产品
					product.notify();
				} catch (Exception e) {}
			}
		}
	}
}

class Product {
	//使用list集合模拟一个产品栈
	private List<Object> goods = new LinkedList<Object>();
	private int max = 10; //最大产品数量
	
	public void add(Object obj) {
		goods.add(obj);
	}
	
	public void remove() {
		if ( goods.size() > 0 ) {
			goods.remove(goods.size()-1);
		}
	}
	
	public int size() {
		return goods.size();
	}
	
	public int getMax() {
		return this.max;
	}
	
	public void setMax(int max) {
		this.max = max;
	}
}


你可能感兴趣的:(Java多线程模拟生产者消费者问题)