zoukankan      html  css  js  c++  java
  • 生产者消费者问题

    生产者消费者问题

    这是一个线程同步问题,两者共享一个资源

    • 生产者通知消费者等待,生产后通知消费
    • 消费者消费后,通知生产者结束消费,需要生产新产品

    在生产者消费者问题中,仅有synchronized是不够的。

    synchronized可阻止并发更新同一共享资源,实现不了同步

    synchronized不能用来实现不同线程之间的消息传递(通信)

    /*
    线程通信的方法
    wait()
    	等待,会释放锁
    notify()
    	唤醒处于等待状态的线程
    均是object方法,只能在同步方法或同步代码块中使用,否则会抛异常
    
    

    解决方法

    管程法

    生产者---->数据据缓存区--->消费者

    生产者将生产好的放入缓冲区。消费者从缓冲区拿数据

    package com.hao.senior;
    //生产者消费者问题
    //利用缓存区,管程法
    public class TestPC{
        public static void main(String[] args) {
            SynContainer synContainer = new SynContainer();
            new Productor(synContainer).start();
            new Consumer(synContainer).start();
        }
    
    }
    //生产者
    class Productor extends Thread{
        SynContainer container;
        public Productor(SynContainer container){
            this.container = container;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    container.push(new Chicken(i));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("生产了"+i+"只鸡");
            }
        }
    }
    //消费者
    class Consumer extends Thread{
        SynContainer container;
        public Consumer(SynContainer container){
            this.container = container;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    System.out.println("消费了"+container.pop().id+"只鸡");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //产品
    class Chicken{
        int id;//产品编号
        public Chicken(int id){
            this.id=id;
        }
    }
    //缓冲区
    class SynContainer{
        //需要一个容器大小
        Chicken [] chickens = new Chicken[10];
        //容器计数器
        int count =0;
    
        //生产者放入产品
        public synchronized void push(Chicken chicken) throws Exception {
            //判断是否需要生产,如果容器满了,就需要等待消费者消费
            if (count==chickens.length){
                //通知消费者消费,生产者等待
                this.wait();
            }
    
            //如果没有满,就count++
            chickens[count]=chicken;
            count++;
    
            //通知
            this.notifyAll();
        }
    
        //消费者消费
        public synchronized Chicken pop() throws Exception {
            //判断能否消费
            if (count==0){
                //等待生产者生产
                this.wait();
            }
            //可以消费
            count--;
            Chicken chicken = chickens[count];
    
            //吃完了
            this.notifyAll();
            return chicken;
    
        }
    }
    
  • 相关阅读:
    PAT1065. A+B and C (64bit)
    PAT1064. Complete Binary Search Tree
    PAT 1063. Set Similarity
    CodeForces
    Golang在京东列表页实践总结
    asp.net 5 如何使用ioc 以及在如何获取httpcontext对象
    陨石坑之webapi 使用filter中如何结束请求流
    陨石坑之webapi使用filter
    Socket通信前必须考虑的几件事
    ZeroMQ的进阶
  • 原文地址:https://www.cnblogs.com/haohaoxuexio/p/14582882.html
Copyright © 2011-2022 走看看