美文网首页
多线程11生产者消费者

多线程11生产者消费者

作者: RyanHugo | 来源:发表于2020-03-22 16:01 被阅读0次

    代码

    生产者

    public class PushTarget implements Runnable{
        Tmall tmall;
        public PushTarget(Tmall tmall){
            this.tmall = tmall;
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                tmall.push();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    消费者

    public class TakeTarget implements Runnable{    
        Tmall tmall;
        public TakeTarget(Tmall tmall){
            this.tmall = tmall;
            
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                tmall.take();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    

    Tmall

    public class Tmall {
    
        int count;
        
        public final int MAX_COUNT=10;
        
        public synchronized void push(){
    //      用while防止叫醒后执行count++
            while (count >= MAX_COUNT) {
    //          达到10,生产者停止生产,生产线程等待
                System.out.println("达到10,生产者停止生产");
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            count++;
            System.out.println("生产者,目前库存"+count);
    //      生产完后通知等待的消费者线程
            notifyAll();
        }
        
        public synchronized void take(){
            
            while (count<=0) {
    //          达到0,库存不够,消费线程等待
                System.err.println("库存不够");
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            count--;
            System.err.println("消费后剩余"+count);
    //      消费后通知等待的生产线程
            notifyAll();
            
        }
    }
    

    测试

    public class Main {
    
        public static void main(String[] args) {
            Tmall tmall = new Tmall();
            TakeTarget t = new TakeTarget(tmall);
            PushTarget p = new PushTarget(tmall);
            new Thread(p).start();
            new Thread(p).start();
            new Thread(p).start();
            new Thread(p).start();
            
            new Thread(t).start();
            new Thread(t).start();
            new Thread(t).start();
    //      new Thread(t).start();  
        }   
    }
    

    相关文章

      网友评论

          本文标题:多线程11生产者消费者

          本文链接:https://www.haomeiwen.com/subject/iprvyhtx.html