• 生产者消费者问题(java代码改进版)


    问题描述:

      生产者进行生产,将生产的产品放入缓冲区;消费者从缓冲区中取出产品进行消费;当缓冲区已经放满产品时,生产者应该暂停生产,等待缓冲区中腾出空间来存放生产出来的产品;当缓冲区为空时,消费者不可以从缓冲区取产品拿来消费,必须等待生产者生产过后才能从缓冲区中取出产品来消费。实现过程中用到了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();
        }
    }
    

      

    态度决定高度,细节决定成败,
  • 相关阅读:
    @try { } @catch (NSException *exception) {} @finally {}
    键盘点出来就退不掉了,你可以把这几句加到有键盘的控制器里
    测试最新的微信iOS SDK 报错误
    堆、栈知识小结
    PV操作
    continue & break
    dll的def文件与__declspec(dllexport)导出函数方式比较
    setupapi.h和setupapi.lib該如何使用
    批量缺少头文件的解决办法(添加包含目录)
    易犯错误总结:
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/2831250.html
Copyright © 2020-2023  润新知