今天自己写了一个生产者消费者模型,在单一的生产者和消费者的练习中没有问题,生产一个数据消费一个数据;
可是当增加了一个消费者的时候,生产者就会生产负数的产品出来了,我家的判断是,当产品<0;是阻塞消费者,但是
好像没成功,依然产生负数的产品;
求大神答疑解惑;
下面贴代码
package Thread_p_c; public class Producer implements Runnable { private Product p; public Producer (Product p) { this.p = p; } @Override public void run() { while(true) { synchronized (p) { if(!p.isFlag()) { try { p.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("生产者开始制造产品:"); int i = p.getPno(); i++; p.setPno(i); p.setFlag(false); System.out.println("生产者生产了" + p.getPname() + "->" + p.getPno()); System.out.println("生产者结束生产,等待消费!"); p.notify(); } } } }
package Thread_p_c; public class Consumer implements Runnable { private Product p; public Consumer(Product p) { this.p=p; } @Override public void run() { while(true) { synchronized (p) { if (p.isFlag() || p.getPno()<=0) { try { p.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("消费者进入商场消费"); System.out.println("消费者开始消费产品:"); System.out.println("消费者消费中......."); int i = p.getPno(); System.out.println("消费者结束消费,消费了" + p.getPname() + ":" + p.getPno()); i--; p.setPno(i); p.setFlag(true); p.notify(); System.out.println("消费结束,正在通知生产厂家生产..."); } } } }
package Thread_p_c; public class Product { private int pno=0; public Product(String pname) { this.pname=pname; } private String pname ="灯泡"; private boolean flag = true; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getPno() { return pno; } public void setPno(int pno) { this.pno = pno; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } }
package Thread_p_c; public class pc_model { private int i = 0; private boolean flag = true; public static void main(String[] args) { Product p = new Product("灯泡"); Thread t1 = new Thread(new Producer(p)); Thread t2 = new Thread(new Consumer(p)); t1.start(); t2.start(); // new Thread(new Producer(p)).start(); // new Thread(new Consumer(p)).start(); } }