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,不用去考虑进程同步的问题. 管程: packag ...
- 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>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
随机推荐
- 使用Mac App Store更新、下载软件时出现未知错误的解决方法
很多果迷在使用 Mac App Store 更新/下载软件时,可能都曾被”未知错误”困扰过,怎么解决也不行.然而,过一段时间不知道做了什么又自己好了.今天我们提供两个解决这个问题的方法,下次遇到这个问 ...
- Android上几种Animation和多个动画同时播放以ScaleAnimation应用详解
在API Demo的View->Animation下可以找到四个Animation的Demo,第一个3D Translate比较复杂,最后再讲,先讲第2个Interpolator.该Activi ...
- asfd
$$\sum_{i=1}^n a_i=0$$$$f(x)=x^{x^x}$$
- R语言中基于聚类的离群点挖掘
思路:首先,通过K-means算法将数据点划分为成若K个簇:然后计算每一个数据对象到最近簇的中心距离,来与离群点设置的阈值进行比较,以此来判别该数据对象是否是离群点. 1.读取数据 data<- ...
- Ubuntu下编译C语言程序(同时给编译生成的文件命名)
1.创建c文件 test.c touch test.c 2.编写test.c vim test.c #include "stdio.h" int main(){ printf(&q ...
- swift中类与结构体
写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...
- git 删除所有提交下的某个文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch upload/*' --prune-empty - ...
- Linux命令:tac
全称:concatenate and print files in reverse 用途:将文件全部内容从尾到头反向连续输出到标准输出(屏幕)上 格式:tac [OPTION]... [FILE].. ...
- Linux(5)- MariaDB、mysql主从复制、初识redis
一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...
- Linux touch命令
touch命令不常用,一般用于更改文件时间戳,或创建一个空文件 命令选项 -a:只更改访问时间 -c:--no-create 不创建任何文件 -d:--date=字符串 使用指定字符串表示时间而非当前 ...