• 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();
                }
                
            }
    }

  • 相关阅读:
    POJ
    服务器端控件的属性
    生成验证码的代码
    无法检测到的代码原因
    Jquery获取服务器端控件的三种方式
    hdu-2421 Deciphering Password 数学姿势
    KM算法 带权二分匹配 O(n^3)
    hdu-3966 Aragorn's Story 树链剖分
    头文件
    输入外挂
  • 原文地址:https://www.cnblogs.com/amy2011/p/2388338.html
Copyright © 2020-2023  润新知