Java 管程解决生产者消费者问题

同样是实验存档。//。。

依然以生产者消费者问题作为背景。

管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就 ok,不用去考虑进程同步的问题。

管程:

package entity.producerconsumer;

public class Monition {
    private Buffer buffer;

    public Monition(int bufferSize) {
        buffer = new Buffer(bufferSize);
    }

    /**
     * 如果放入产品成功返回 true
     * @return
     */
    public synchronized boolean put() {
        if (buffer.notFull()) {
            buffer.putItem();
            return true;
        }
        return false;
    }

    /**
     * 如果取出产品成功返回 true
     * @return
     */
    public synchronized boolean get() {
        if (buffer.notEmpty()) {
            buffer.getItem();
            return true;
        }
        return false;
    }

    public String getStatus() {
        return "" + buffer;
    }
}

生产者 & 消费者:

package entity.producerconsumer;

public class Produc implements Runnable {
    /**
     * 统计生产者数量
     */
    private static int total = 0;
    /**
     * 生产者个体的 id
     */
    private int id;

    private Monition PC;

    public Produc(Monition monition) {
        id = ++total;
        PC = monition;
    }

    @Override
    public void run() {
        while (true) {
            if (PC.put()) {
                // 如果操作成功打印缓冲区状态
                System.out.println(id + " 号生产者: " + PC.getStatus());
            }
        }
    }
}

/

package entity.producerconsumer;

public class Consu implements Runnable {
    /**
     * 统计消费者数量
     */
    private static int total = 0;
    /**
     * 消费者个体的 id
     */
    private int id;

    private Monition PC;

    public Consu(Monition monition) {
        id = ++total;
        PC = monition;
    }

    @Override
    public void run() {
        while (true) {
            if (PC.get()) {
                // 如果操作成功打印缓冲区状态
                System.out.println(id + " 号消费者: " + PC.getStatus());
            }
        }
    }
}

/

Buffer.java

测试:

package test;

import entity.producerconsumer.Consu;
import entity.producerconsumer.Monition;
import entity.producerconsumer.Produc;

public class MonitionTest {
    public static void main(String[] args) {
        Monition PC = new Monition(10);
        // 创建 5 个生产者和 5 个消费者
        for (int i = 0; i != 5; ++i) {
            new Thread(new Produc(PC)).start();
            new Thread(new Consu(PC)).start();
        }
    }
}
时间: 2024-10-14 00:43:51

Java 管程解决生产者消费者问题的相关文章

java多线程解决生产者消费者问题

import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class Test { public static void main(String[] args) { GunClip clip = new GunClip(); Producer p = new Producer(clip); customer c = new customer(clip); p.star

使用管程实现生产者消费者模式

生产者消费者模式是一种常见的设计模式,掌握一种完美,稳定的实现方式非常有用,下面我就使用misa管程实现生产者消费者模式. 这种实现的优点: 1.稳定,不会出现死锁现象 2.运行速度相对较快 话不多说,直接上代码: 管程类: package com.brave.test; import java.util.ArrayList; import java.util.List; /** * * @描述:管程区 * * @author <p>[email protected]<p> bra

【译】使用阻塞队列解决生产者-消费者问题

如果你想避免使用错综复杂的wait–notify的语句,BlockingQueue非常有用.BlockingQueue可用于解决生产者-消费者问题,如下代码示例.对于每个开发人员来说,生产者消费者问题已经非常熟悉了,这里我将不做详细描述. 为什么BlockingQueue适合解决生产者消费者问题 任何有效的生产者-消费者问题解决方案都是通过控制生产者put()方法(生产资源)和消费者take()方法(消费资源)的调用来实现的,一旦你实现了对方法的阻塞控制,那么你将解决该问题. Java通过Blo

用信号量解决生产者消费者问题

用信号量解决生产者消费者问题: ipc.h #ifndef _IPC_H_ #define _IPC_H_ #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <errno.h> #include <stdio.h> #include <st

两种方式解决 生产者消费者问题

一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确的,可知阻塞队列内部意见实现了同步,不需要我们额外同步,是线程安全的.

使用Java的BlockingQueue实现生产者-消费者

http://tonl.iteye.com/blog/1936391 使用Java的BlockingQueue实现生产者-消费者 博客分类: Java JavaBlockingQueue阻塞队列 BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类1.ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须

使用条件量解决生产者消费者问题

在linux多线程同步中,除了互斥量以外,pthread提供了另一种同步机制:条件变量.正如名字一样,条件量允许线程由于一些未达到的条件而阻塞. 条件变量与互斥量经常一起使用.这种模式用于让一个线程锁住一个变量,然后当它不能获得它期待的结果时等待一个条件变量.最后另一个线程会向他发出信号,使它可以继续执行.pthread_cond_wait原子性地调用并解锁它持有的互斥量.由于这个原因,互斥量是参数之一. 下面通过代码演示如何通过条件量来解决生产者消费者问题. #include<stdio.h>

基于java callable及future接口解决生产者消费者问题

这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者-消费者模式,这个食堂中只有1张桌子,同时最多放10个盘子,现在有4个厨师做菜,每做好一盘就往桌子上放(生产者将产品往仓库中放),而有6个食客不停地吃(消费者消费产品,为了说明问题,他们的食量是无的).一般而言,厨师200-400ms做出一盘菜,而食客要400-600ms吃完一盘.当桌子上放满了10个

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {