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

            计算机系统中,每一个进程都申请使用和释放各种不同类型的资源,这些资源既可以像外设、内存、缓冲区等硬件资源,也包括临界区、数据、例程等软件资源,把系统中使用的某一类资源的进程称为消费者,而把释放同类资源的进程称之为该资源的生产者。

      生产者和消费者的问题是一个同步问题。把一个长度为n的有界缓冲区与一群生产者进程P1,P2,P3.....和一群消费者进程C1,C2,C3.....联系起来。

      生产者和消费者之间应该满足如下条件:

        (1)消费者想接收数据时,有界缓冲区中至少有一个单元是满的。

        (2)生产者想发送数据时,有界缓冲区中至少有一个单元是空的。

    //有界缓冲区

    package com.swust.second;

    public class Buffer {

    private int contents;
    private boolean available = false;

    public synchronized int get(){
    while(! available){
    try {
    this.wait();
    } catch (InterruptedException e) {
    // TODO: handle exception
    }
    }
    int value = contents;
    //消费者取出内容,改变存贮控制available
    available = false;
    System.out.println("取出:"+contents);
    this.notify();
    return value;
    }

    public synchronized void put(int value){
    while(available){
    try {
    this.wait();
    } catch (InterruptedException e) {
    // TODO: handle exception
    }
    }
    contents = value;

    //生产者放入内容,改变存取控制available
    available = true;

    System.out.println("放入:"+contents);

    this.notifyAll();
    }
    }

    //生产者

    package com.swust.second;

    //生产者线程
    public class Producter extends Thread{
    private Buffer buffer;
    private int number;
    public Producter(Buffer buffer, int number) {
    super();
    this.buffer = buffer;
    this.number = number;
    }
    public void run(){
    for(int i=0;;){
    buffer.put(i);
    System.out.println("生产者:"+number+"生产"+i++);
    try {
    Thread.sleep((int)(Math.random()*100));
    } catch (InterruptedException e) {
    // TODO: handle exception
    }
    }
    }
    }

    //消费者

    package com.swust.second;

    public class Consumer extends Thread{

    private Buffer buffer;
    private int number;
    public Consumer(Buffer buffer, int number) {
    super();
    this.buffer = buffer;
    this.number = number;
    }

    public void run(){
    for(;;){
    int v = buffer.get();
    System.out.println("消费者 "+number+"消费"+v);
    }
    }
    }

    //主程序

    package com.swust.second;

    public class Consumer extends Thread{

    private Buffer buffer;
    private int number;
    public Consumer(Buffer buffer, int number) {
    super();
    this.buffer = buffer;
    this.number = number;
    }

    public void run(){
    for(;;){
    int v = buffer.get();
    System.out.println("消费者 "+number+"消费"+v);
    }
    }
    }

    //效果

  • 相关阅读:
    【EXCEL】乱数関数集合
    PHP 获取当前时间前52周 12个月 4个季度
    python 清理没有过期时间的redis
    yii2 使用mongo查询(包含like查询)
    crontab 时间详解
    安装 cronsun
    php的加密&解密 (压缩数据) gzcompress & gzuncompress
    三数之和
    贪心算法解决集合覆盖问题
    KMP算法实现字符串匹配
  • 原文地址:https://www.cnblogs.com/walxt/p/12197558.html
Copyright © 2011-2022 走看看