生产者与消费者,学习多线程

package ThreadDemo;

import java.util.Date;

/*生产者(Producer)将产品交给店员(check),而消费者(Customer)从店员出取走产品。
 店员一次只能维持固有数量的产品(比如20)。如果生产者试图生产更多的产品,店员会叫生产者停一下。
 如果店中有空位,店员会叫生产者生产。如果店中没有产品了,会告诉消费者等一下。如果店中有产品了
 再通知消费者来取走。
 *
 *分析1
 *1:是否涉及到多线程的问题?是!生产者,消费者
 *2:是否会涉及到共享数据?是  
 *3:此共享数据是谁?产品的数量
 *4:是否涉及到线程的通信?存在生产者与消费者的通信。
 *分析2
 *1.有个店员类Clerk,负责检查当前产品数量,并应该有两个方法,增加产品,减少产品
 *2:有个生产者Producer.Producer 是个线程,需要循环不断的  调用增加产品的方法。
 *3:有个消费者Customer Producer 是个线程,需要循环不断的  调用减少产品的方法。
 *
 */
class Clerk { // 店员
	int product = 0;
	Date d = new Date();

	public void addProduce() {

		synchronized (Clerk.class) { // 如果这个地方用的是类锁,后面的wait,就必须用Clerk.class.wait这种形式
										// Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,
										// 也就是wait,与notify是针对已经获取了Obj锁进行操作.
			// synchronized (this) {
			if (product >= 20) {
				try {
					Clerk.class.wait();
					// wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {
				product++;
				System.out.println(Thread.currentThread().getName() + ":"
						+ product);
			}
			Clerk.class.notifyAll();
			// notifyAll()

		}

	}

	public void reduceProduce() {

		synchronized (Clerk.class) {

			if (product <= 0) {
				try {
					Clerk.class.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} else {
				System.out.println(Thread.currentThread().getName() + ":"
						+ product);
				product--;
			}
			Clerk.class.notifyAll();
		}

	}

}

class Producer implements Runnable {// 生产者
	Clerk clerk;

	public Producer(Clerk clerk) {
		this.clerk = clerk;
	}

	public void run() {
		while (true) {
			clerk.addProduce();
			// TODO Auto-generated method stub
		}
	}
}

class Customer implements Runnable {// 生产者
	Clerk clerk;

	public Customer(Clerk clerk) {
		this.clerk = clerk;
	}

	public void run() {
		while (true) {
			clerk.reduceProduce();
		}
	}
}

public class CopyOfTestProduceConsume {
	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		Producer producer = new Producer(clerk);
		Thread thread1 = new Thread(producer);
		thread1.setName("生产者");
		Customer customer = new Customer(clerk);
		Thread thread2 = new Thread(customer);
		thread2.setName("消费者");

		thread1.start();
		thread2.start();

	}

}

猜你喜欢

转载自programmer-q.iteye.com/blog/2256304