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

    //效果

  • 相关阅读:
    [USACO5.3]校园网Network of Schools
    [USACO13OPEN]照片Photo

    flask的orm框架----------Flask-SQLAlchemy应用
    Flask-session用法
    flask--自定义auth模块
    flask -falsk_script用法
    Flask-SQLAlchemy数据库
    flask--session源码解析
    flask-源码请求源码
  • 原文地址:https://www.cnblogs.com/walxt/p/12197558.html
Copyright © 2011-2022 走看看