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

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

管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就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();
}
}
}

最新文章

  1. how2heap分析系列:0
  2. Eclipse Memory Analysis进行堆转储文件分析
  3. SGU 195. New Year Bonus Grant
  4. Vijos 1100 加分二叉树
  5. .NET中Redis安装部署及使用方法简介
  6. K8S API 调用
  7. WEB 集群与负载均衡(一)基本概念-上
  8. oracle 游标简单示例
  9. js打印html指定元素,解决动态获取的图片无法打印问题
  10. 【Java】【11】String数组和List相互转换
  11. 大规模数据导入和导出(sqlserver)
  12. Django contenttypes 应用
  13. xml的方式配置AOP:Aspect Oriented Programming
  14. day40 css高级选择器
  15. .gitignore设置
  16. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)
  17. @valid注解
  18. arcgis api for javascript 各个版本的SDK下载
  19. postgresql常用
  20. bzoj 3501 PA2008 Cliquers Strike Back——贝尔数

热门文章

  1. iOS 8出色的跨应用通信效果:解读Action扩展
  2. Android之MessageQueue、Looper、Handler与消息循环
  3. github 's usage
  4. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
  5. 使用 Apache Commons CLI 解析命令行参数示例
  6. Zipline Development Guidelines
  7. 微信js分享朋友圈(二)
  8. virtio后端驱动详解
  9. 使用Custom Draw优雅的实现ListCtrl的重绘
  10. 【我的Android进阶之旅】Android目录过长造成错误:Failed to crunch file abc_textfield_search_activated_mtrl_alpha.9.png