课程设计——利用信号量实现生产者-消费者问题(java)
package cn.Douzi.ProductConsume; import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner; public class ProCon { static int LEN = 3;
static public int PROTIME = 1500;
static public int CONTIME = 1000; static public int totalData = 1000;
static public Queue<Data> buffer = new LinkedList<>();
static public Buffer empty = new Buffer(0, 10);
static public Mutex mutex = new Mutex(1); public ProCon() {
} public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("|-----------------------------------------------------------|");
System.out.println("| |");
System.out.println("| Welcome to My System ! |");
System.out.println("| ↖ By Douzi 2017 ↗ |");
System.out.println("| 生产消费开始进行 |");
System.out.println("| |");
System.out.println("|-----------------------------------------------------------|\n"); Scanner scaner = new Scanner(System.in);
System.out.println("设置缓冲区大小: ");
LEN = scaner.nextInt();
System.out.println("缓冲区大小: " + LEN + "\n"); System.out.println("设置生产休眠时间: ");
ProCon.PROTIME = scaner.nextInt();
System.out.println("设置消费休眠时间: ");
ProCon.CONTIME = scaner.nextInt(); ProductWindows pro = new ProductWindows();
ConsumeWindows con = new ConsumeWindows(); Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
t1.start(); t2.start();
} } class ProductWindows implements Runnable { public ProductWindows() {
} @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(ProCon.PROTIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ProCon.totalData++;
System.out.println("生产数据:" + ProCon.totalData);
if (ProCon.buffer.size() < ProCon.LEN) {
synchronized (ProCon.mutex) {
ProCon.buffer.add(new Data(ProCon.totalData));
System.out.println("将数据: " + ProCon.totalData + " 放入缓冲区");
System.out.println("此时缓冲区大小: " + ProCon.buffer.size() + "\n");
}
} else {
System.out.println("缓冲区满,等待数据取出缓冲区.....................\n");
ConsumeWindows con = new ConsumeWindows();
Thread t2 = new Thread(con);
t2.start();
break;
}
}
} } class ConsumeWindows implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
// System.out.println("Test"); while (true) {
Data d = new Data(0);
try {
Thread.sleep(ProCon.CONTIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (ProCon.buffer.size() > 0) {
synchronized (ProCon.mutex) {
d = ProCon.buffer.peek(); ProCon.buffer.poll();
System.out.println("从缓冲区取出数据: " + d.getData());
}
} else {
System.out.println("缓冲区空,等待数据放入缓冲区..................\n");
ProductWindows pro = new ProductWindows();
Thread t1 = new Thread(pro);
t1.start();
break;
}
System.out.println("消费数据: " + d.getData() + "\n");
} } } class Data {
private int data; public Data(int data) {
super();
this.data = data;
} public int getData() {
return data;
}
} class Mutex {
private int mutex; public Mutex(int mutex) {
super();
this.mutex = mutex;
} } class Buffer {
private int full;
private int empty;
public Buffer(int full, int empty) {
super();
this.full = full;
this.empty = empty;
}
}
课程设计——利用信号量实现生产者-消费者问题(java)的更多相关文章
- 课程设计——利用信号量实现哲学家进餐问题(JAVA)
package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile ...
- 课程设计——利用信号量实现读-写者问题(JAVA)
package cn.Douzi.ReadWriter; import java.util.Scanner; public class ReadWrite { static public int co ...
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- 【Windows】用信号量实现生产者-消费者模型
线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- 生产者消费者模型Java实现
生产者消费者模型 生产者消费者模型可以描述为: ①生产者持续生产,直到仓库放满产品,则停止生产进入等待状态:仓库不满后继续生产: ②消费者持续消费,直到仓库空,则停止消费进入等待状态:仓库不空后,继续 ...
- 生产者消费者模式-Java实现
感知阶段 随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理.每日PV十多亿的淘宝,处理并发的手段可谓是业界一流.用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理 ...
- 生产者消费者模型java
马士兵老师的生产者消费者模型,我感觉理解了生产者消费者模型,基本懂了一半多线程. public class ProducerConsumer { public static void main(Str ...
- 生产者消费者问题Java三种实现
生产者-消费者Java实现 2017-07-27 1 概述 生产者消费者问题是多线程的一个经典问题,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品. 解决生产者/ ...
随机推荐
- lintcode-457-经典二分查找问题
457-经典二分查找问题 在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1 样例 给出数组 [1, 2, 2, 4, 5, 5]. 对于 target = 2, 返回 1 或者 ...
- 转 下一代云计算模式:Docker正掀起个性化商业革命
下一代云计算模式:Docker正掀起个性化商业革命 作者: 吴宁川 来源: ITValue 发布时间: 2015-09-20 10:41 阅读: 14052 次 推荐: 26 原文链接 ...
- Solr初步研究
Solr是一个高性能,采用Java5开发,Solr基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供 ...
- Scrum Meeting Beta - 4
Scrum Meeting Beta - 4 NewTeam 2017/12/2 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了部分页面标题栏颜色的修改和字体的调整Iss ...
- 【第一周】第一周工作统计(psp)
项目:词频统计 项目类型:个人项目 项目完成情况:已完成 项目改进:未变更 项目日期:2016.9.3-2016.9.4 3号 类别c 内容c 开始时间s 结束e 中断I 净时间T 项目实践 构思 ...
- CodeForces Round #527 (Div3) D1. Great Vova Wall (Version 1)
http://codeforces.com/contest/1092/problem/D1 Vova's family is building the Great Vova Wall (named b ...
- CentOS安装crontab及使用方法(转)
CentOS安装crontab及使用方法(转) 安装crontab:[root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum ins ...
- cli 中php的配置和phpinfo不一样
这是因为加载的php.ini的路径不一样 可以通过查看 php -i | grep php.ini 来确定两个加载的配置路径是一样的 win中没有grep的命令,可以把php -i 的内容重定向输出到 ...
- jQuery+PHP+Mysql在线拍照和在线浏览照片
本文用示例讲述了如何使用jQuery与PHP及Mysql结合,实现WEB版在线拍照.上传.显示浏览的功能,ajax交互技术贯穿本文始末,所以本文的读者要求具备相当熟悉jQuery及其插件使用和javs ...
- 外部JS的阻塞下载
转载于:http://www.cnblogs.com/mofish/archive/2011/09/29/2195256.html 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载, ...