zoukankan      html  css  js  c++  java
  • 生产者消费者问题(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();
        }
    }
    

      

    态度决定高度,细节决定成败,
  • 相关阅读:
    c#简单操作MongoDB_2.4
    将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
    利用双缓冲队列来减少锁的竞争
    移动端地区选择控件mobile-select-area
    服务器CPU居高不下--解决问题历程
    .NET常用开发工具整理
    免费的精品: Productivity Power Tools 动画演示
    二维码编码与解码类库ThoughtWorks.QRCode
    C#异步编程基础入门总结
    优盘版Kali
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/2831250.html
Copyright © 2011-2022 走看看