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)的更多相关文章

  1. 课程设计——利用信号量实现哲学家进餐问题(JAVA)

    package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile ...

  2. 课程设计——利用信号量实现读-写者问题(JAVA)

    package cn.Douzi.ReadWriter; import java.util.Scanner; public class ReadWrite { static public int co ...

  3. Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  4. 【Windows】用信号量实现生产者-消费者模型

    线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...

  5. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  6. 生产者消费者模型Java实现

    生产者消费者模型 生产者消费者模型可以描述为: ①生产者持续生产,直到仓库放满产品,则停止生产进入等待状态:仓库不满后继续生产: ②消费者持续消费,直到仓库空,则停止消费进入等待状态:仓库不空后,继续 ...

  7. 生产者消费者模式-Java实现

    感知阶段 随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理.每日PV十多亿的淘宝,处理并发的手段可谓是业界一流.用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理 ...

  8. 生产者消费者模型java

    马士兵老师的生产者消费者模型,我感觉理解了生产者消费者模型,基本懂了一半多线程. public class ProducerConsumer { public static void main(Str ...

  9. 生产者消费者问题Java三种实现

    生产者-消费者Java实现 2017-07-27 1 概述 生产者消费者问题是多线程的一个经典问题,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品. 解决生产者/ ...

随机推荐

  1. IHttpModule的那些事

    写在前面 关于IHttpModule的相关内容,在面试的时候也被问到过,当时也是隐隐约约的感觉这个接口有一个Init方法,可以在实现类中的Init方法注册一系列的事件,说句实话,具体哪些事件,忘了差不 ...

  2. Swift-存储属性,计算属性,类属性

    //类的属性定义 class Student: NSObject { // 定义属性 // 定义存储属性 var age : Int = var name :String? var mathScore ...

  3. 在原有的基础之上,启用NAT模型

    # 给虚拟主机实例添加一个网关 route add default gw 192.168.23.1   # 在宿主机打开网卡间转发功能 echo 1 > /proc/sys/net/ipv4/i ...

  4. 使用java程序模拟页面发送http的post请求

    在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下: import java.io.BufferedReader; import ja ...

  5. javascript 排序

    // 插入排序 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置.(如果待插入的元素与有序 ...

  6. webgl example1

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  7. 单源最短路径spfa模板(pascal)洛谷P3371

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  8. Testng 运行Cannot find class in classpath

    用Testng运行多个class,结果报: org.testng.TestNGException: Cannot find class in classpath: Salesman     at or ...

  9. [codeforces696B]Puzzles

    B. Puzzles time limit per test  1 second memory limit per test 256 megabytes input standard input ou ...

  10. 飞舞的蝴蝶(GraphicsView框架)

    飞舞的蝴蝶(GraphicsView框架) 一.简介 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(容器).QGraphicsView(视图).QGraphicsI ...