生产者消费者问题

出自:https://www.imooc.com/article/15881

package
操作系统; /** * * * 生产者/消费者问题 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer) * *从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果 *生产者试图生产更多的产品,店员会叫生产者停一下, * *如果店中有空位放产品了在通知生产者继续生产,如果店中没有产品了,店员 *会告诉消费者一下,如果店中有产品了在通知消费者来取走产品。 * * *分析: * * *1.是否涉及到多线程的问题?是!生产者、消费者两个都是线程。 *2.是否涉及到共享数据?有!考虑线程的安全 *3.此共享数据是谁?即为产品的数量。 * *4.是否涉及到线程的通信呢?存在着生产者与消费者的通信 * * */ class Clerk { int product; public synchronized void addProduct() { if (product >= 10) { try { System.out.println("生产满了"); wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { product++; System.out.println(Thread.currentThread().getName() + "生产了第" + product + "个产品"); notifyAll(); } } public synchronized void consumeProduct() { if (product <= 0) { try { wait(); System.out.println("等待消费产品"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println(" " + Thread.currentThread().getName() + "消费了第" + product + "个产品"); product--; notifyAll(); } } } class Producer implements Runnable { Clerk clerk; public Producer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub System.out.println("生产者开始生产产品"); while (true) { try { Thread.currentThread(); Thread.sleep((int)(Math.random()*100)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clerk.addProduct(); } } } class Consumer implements Runnable { Clerk clerk; public Consumer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub System.out.println("消费者开始消费产品"); while (true) { try { Thread.currentThread(); Thread.sleep((int)(Math.random()*5000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clerk.consumeProduct(); } } } public class TestProduceConsume { public static void main(String[] args) { Clerk clerk = new Clerk(); Producer producer = new Producer(clerk); Consumer consumer = new Consumer(clerk); Thread t1 = new Thread(producer); Thread t2 = new Thread(consumer); t1.setName("生产者"); t2.setName("消费者"); t1.start(); t2.start(); } }

 

posted @ 2018-02-22 15:45  七月的南方  阅读(138)  评论(0编辑  收藏  举报