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());
            }
        }
    }
}
/
测试:
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();
}
}
}
Java 管程解决生产者消费者问题的更多相关文章
- Java管程解决生产者消费者问题
		同样是实验存档.//.. 依然以生产者消费者问题作为背景. 管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就ok,不用去考虑进程同步的问题. 管程: package ... 
- java多线程解决生产者消费者问题
		import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ... 
- Java如何使用线程解决生产者消费者问题?
		在Java编程中,如何使用线程解决生产者消费者问题? 以下示例演示如何使用线程解决生产者消费者问题. package com.yiibai; public class ProducerConsumer ... 
- 使用Java的BlockingQueue实现生产者-消费者
		http://tonl.iteye.com/blog/1936391 使用Java的BlockingQueue实现生产者-消费者 博客分类: Java JavaBlockingQueue阻塞队列 B ... 
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
		前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ... 
- 基于java callable及future接口解决生产者消费者问题
		这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ... 
- java使用synchronized与Semaphore解决生产者消费者问题对比
		一.synchronized与信号量Semaphore简介 1.synchronized是java中的关键字,是用来控制线程同步的问题最常用的方法. 2.Semaphore是属于java的一个类,同样 ... 
- java信号量PV操作 解决生产者-消费者问题
		package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ... 
- JAVA多线程经典问题  -- 生产者 消费者
		工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ... 
随机推荐
- 设置SO_RECVBUF和SO_SENDBUF套接字选项
			控制套接字的行为(如修改缓冲区的大小). int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) ... 
- Flex布局学习笔记
			任何元素都可以使用Flex布局,包括行内元素 display: flex; display: inline-flex使用Flex布局之后,子元素的float, clear, vertical-alig ... 
- java 之 抽象工厂模式(大话设计模式)
			看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套. 来看下类图: 大话设计模式-类图 看类图已经很乱 ... 
- Spring Cloud Ribbon 整合 Hystrix
			在前面随笔 Spring Cloud 之 Ribbon 的ribbon工程基础上进行改造 1.pom.xml 加入依赖 <dependency> <groupId>org.sp ... 
- phython廖雪峰
			这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ... 
- C#的数据类型总结(2):decimal ,double,float的区别
			1> 三者是精度不同的浮点数,如下图 参见:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/language-reference/ ... 
- Java 代码学习之理解数据类型中的坑
			package dailytest; import org.junit.Test; public class DataTypeTest { /** * 当有字符串第一次参与运算后,+成了连接符的作用 ... 
- springmvc关于前台日期作为实体类对象参数类型转换错误
			页面报错: 后台错误: Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [ty ... 
- SAML2.0 协议初识(一)
			一.什么是 SAML 协议? SAML 即安全断言标记语言,英文全称是 Security Assertion Markup Language.它是一个基于 XML 的标准,用于在不同的安全域(secu ... 
- 【DevOps】团队敏捷开发系列--开山篇
			随着软件发布迭代的频率越来越高,传统的「瀑布型」(开发-测试-发布)模式已经不能满足快速交付的需求.2009 年左右 DevOps 应运而生,开发运维一体化,通过自动化工具与流程让整个软件开发构建.测 ... 
