问题描述:
生产者进行生产,将生产的产品放入缓冲区;消费者从缓冲区中取出产品进行消费;当缓冲区已经放满产品时,生产者应该暂停生产,等待缓冲区中腾出空间来存放生产出来的产品;当缓冲区为空时,消费者不可以从缓冲区取产品拿来消费,必须等待生产者生产过后才能从缓冲区中取出产品来消费。实现过程中用到了size和n两个变量,size表示缓冲区的大小,n表示当前缓冲区中产品的数目,这段代码实现了互斥访问临界变量,并且生产者不必待消费者消费完缓冲区中全部产品后才进行生产,同时消费者也不必等待生产者放满缓冲区后才进行消费,是对前一次代码的改进。
代码实现如下:
class Q { String name; int num=0; int size=10; } class Producer implements Runnable { Q q; Producer(Q q) { this.q = q; this.q.name="producer"; } public void run() { while(true) { synchronized(q) { if(q.num<q.size) { q.num++; System.out.println("producer已生产第:"+q.num+"个产品!"); try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } q.notify(); } else { try { System.out.println("producer stop!"); q.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } class Consumer implements Runnable { Q q; Consumer(Q q) { this.q = q; this.q.name="consumer"; } public void run() { while(true) { synchronized(q) { if(q.num>0) { System.out.println("consumer要消费第:"+q.num+"个产品!"); q.num--; try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } q.notifyAll(); } else { try { System.out.println("consumer stop!"); q.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public class project { public static void main(String[] args) { Q q = new Q(); new Thread(new Producer(q)).start(); new Thread(new Consumer(q)).start(); } }