zoukankan      html  css  js  c++  java
  • java多线程实现生产者与消费者问题 Amy

    生产者与消费者多线程实现,首先的问题就是同步,就是关于临界资源的访问

    我们首先来定义一个临界资源类,这里设为Q

    class Q
    { int z=4; 
    }
    这个int型的z就是我假设的临界资源的个数

    然后是生产者的put动作

    synchronized void put()
        {
            if(z>0)//当临界资源的个数大于0时,生产者等待wait,否则,生产者进行生产,生产之后唤醒notifyAll()挂起的消费者
            {
                try{wait();}catch(Exception e){}
            }
            else
            {
                System.out.print(Thread.currentThread()+"   ");
                System.out.println(++z);
                try{notifyAll();}catch(Exception e){}
            }
        }

    然后是消费者进行消费的过程get

    synchronized void get()
        {
            if(z<=0)//当临界资源的个数等于或者小于0时,消费者进程等待
            {
                try{wait();}catch(Exception e){}
            }
            else
            {
                System.out.print(Thread.currentThread().getName()+"   ");
                System.out.println(z--);
                if(z==0)//当一个消费者消费完之后检查了一下临界资源,发现资源为0,那么唤醒生产者来进行生产
                {
                    notify();
                }
                
            }
        }

    然后是生产者和消费者类的定义

    这里的生产者和消费者都是Thread类的子类,故都要完成run方法,这里run方法一般为无限循环

    class producer extends Thread
    {
            Q q;
            public producer(Q q)
            {
                this.q=q;
            }
            public void run()
            {
                while(true)
                {
                    q.put();
                }
                
            }
    }

    class consumer extends Thread
    {
        Q q;
        public  consumer(Q q)
        {
            this.q=q;
        }
            public void run()
            {
                while(true)
                {
                    q.get();
                }
                
            }
    }

    这里需要注意,因为只能生产一个临界资源对象,这里我们放在主函数里面,所以,需要构造生产者和消费者的构造函数,并将临界资源作为参数传递进来,进行put与get操作

    整个函数定义如下:

    public class a
    {    
        public static void main(String[]args)
        {    Q q=new Q();
            Thread t1,t2,t3;
            t1=new producer(q);
            t2=new consumer(q);
            t3=new consumer(q);
            t1.start();
            t2.start();
            t3.start();
        }
        
    }
    class Q
    {
        int z=4;
        synchronized void put()
        {
            if(z>0)
            {
                try{wait();}catch(Exception e){}
            }
            else
            {
                System.out.print(Thread.currentThread()+"   ");
                System.out.println(++z);
                try{notifyAll();}catch(Exception e){}
            }
        }
        synchronized void get()
        {
            if(z<=0)
            {
                try{wait();}catch(Exception e){}
            }
            else
            {
                System.out.print(Thread.currentThread().getName()+"   ");
                System.out.println(z--);
                if(z==0)
                {
                    notify();
                }
                
            }
        }
    }

    class producer extends Thread
    {
            Q q;
            public producer(Q q)
            {
                this.q=q;
            }
            public void run()
            {
                while(true)
                {
                    q.put();
                }
                
            }
    }

    class consumer extends Thread
    {
        Q q;
        public  consumer(Q q)
        {
            this.q=q;
        }
            public void run()
            {
                while(true)
                {
                    q.get();
                }
                
            }
    }

  • 相关阅读:
    实现镜面模糊效果
    在网页中单行以及多行内容超出之后隐藏
    利用xhsell登录到远程腾讯云服务器
    highcharts饼状图使用案例
    在利用xampp开发时候为apache设置多个项目目录
    Linux查找命令
    数字签名与数字证书
    数据库之闭包,范式
    利用PHP绘图函数实现简单验证码功能
    IC基础(二):设计中常见的时序问题
  • 原文地址:https://www.cnblogs.com/amy2011/p/2388338.html
Copyright © 2011-2022 走看看