您的位置:首页 > 其它

多线程:生产者消费者实例

2014-12-07 21:32 253 查看
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 生产者消费者实例
 */
public class ProducerAndConsumer {

	public static void main(String[] args) {
		Bakery bakery = new Bakery();
		Producer producer = new Producer(bakery);
		Consumer consumer = new Consumer(bakery);
		Thread t1 = new Thread(producer);
		Thread t2 = new Thread(producer);
		Thread t3 = new Thread(consumer);
		Thread t4 = new Thread(consumer);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

/**
 * 定义面包房
 */
class Bakery {
	private int count = 1;
	private String name;
	// 定义是否有面包
	private boolean flag;

	// 定义生产者和消费者线程锁
	Lock lock = new ReentrantLock();
	// 定义生产者和消费者的监视器
	private Condition pro_con = lock.newCondition();
	private Condition con_con = lock.newCondition();

	/**
	 * 生产面包方法
	 */
	public void produceBread(String name) {
		lock.lock();
		try {
			while (flag)
				try {
					pro_con.await();
				} catch (InterruptedException e) {
				}
			this.name = count + "个" + name;
			count++;
			System.out.println(Thread.currentThread().getName() + "面包房生产了第"
					+ this.name);
			this.flag = true;
			con_con.signal();
		} finally {
			// 必须进行锁的释放,否者可能代码中可能出现的异常,导致造成死锁等线程安全问题
			lock.unlock();
		}
	}

	/**
	 * 售卖面包方法
	 */
	public void consumeBread() {
		lock.lock();
		try {
			while (!flag)
				try {
					con_con.await();
				} catch (InterruptedException e) {
				}
			System.out.println(Thread.currentThread().getName() + "消费者买了第"
					+ this.name);
			this.flag = false;
			pro_con.signal();
		} finally {
			// 必须进行锁的释放,否者可能代码中可能出现的异常,导致造成死锁等线程安全问题
			lock.unlock();
		}
	}
}

class Producer implements Runnable {
	private Bakery bakery;

	Producer(Bakery bakery) {
		this.bakery = bakery;
	}

	@Override
	public void run() {
		while (true)
			bakery.produceBread("面包");
	}

}

class Consumer implements Runnable {
	private Bakery bakery;

	Consumer(Bakery bakery) {
		this.bakery = bakery;
	}

	@Override
	public void run() {
		while (true)
			bakery.consumeBread();
	}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: