Java管程解决生产者消费者问题
2024-08-26 04:25:04
同样是实验存档。//。。
依然以生产者消费者问题作为背景。
管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就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();
}
}
}
最新文章
- how2heap分析系列:0
- Eclipse Memory Analysis进行堆转储文件分析
- SGU 195. New Year Bonus Grant
- Vijos 1100 加分二叉树
- .NET中Redis安装部署及使用方法简介
- K8S API 调用
- WEB 集群与负载均衡(一)基本概念-上
- oracle 游标简单示例
- js打印html指定元素,解决动态获取的图片无法打印问题
- 【Java】【11】String数组和List相互转换
- 大规模数据导入和导出(sqlserver)
- Django contenttypes 应用
- xml的方式配置AOP:Aspect Oriented Programming
- day40 css高级选择器
- .gitignore设置
- 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)
- @valid注解
- arcgis api for javascript 各个版本的SDK下载
- postgresql常用
- bzoj 3501 PA2008 Cliquers Strike Back——贝尔数
热门文章
- iOS 8出色的跨应用通信效果:解读Action扩展
- Android之MessageQueue、Looper、Handler与消息循环
- github 's usage
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
- 使用 Apache Commons CLI 解析命令行参数示例
- Zipline Development Guidelines
- 微信js分享朋友圈(二)
- virtio后端驱动详解
- 使用Custom Draw优雅的实现ListCtrl的重绘
- 【我的Android进阶之旅】Android目录过长造成错误:Failed to crunch file abc_textfield_search_activated_mtrl_alpha.9.png