浅谈Java简单实现的生产者与消费者问题
一、面对生产者和消费者的问题,首先我们得明白几点:
生产者:生产数据;
消费者:消费数据。
消费者在没有数据可供消费的情况下,不能消费;
生产者在原数据没有被消费掉的情况下,不能生产新数据。
假设,数据空间只有一个。
实际上,如果实现了正确的生产和消费,则,两个线程应该是严格的交替执行。
synchronized关键字若用在代码中,形成一个同步块,且,必须要执行锁:
synchronized (锁对象) {
同步块
}
同步块使得锁对象称为thread monitor
二、代码实现:
1.首先我们建立一个生产者和消费者共同拥有的锁的类:
package com.mec.about_procuder_customer.core; public class ProcuderCustomer {
//初始状态的数据为0个
protected static volatile int count = 0;
//执行锁
protected final static Object lock = new Object();
}
上述代码有一个关键字volatile,它是保证线程之间有序的一种方式,最重要也是最直接的是禁止寄存器优化。就是如果线程run方法中只是一个循环,并没有执行语句,那么,这个线程将不会执行。
2.我们再来建立一个生产者的类:
package com.mec.about_procuder_customer.core; //生产者
public class Procuder extends ProcuderCustomer implements Runnable { //存放数据的空间
private int[] dataSpace; public Procuder(int[] dataSpace, String threadName) {
this.dataSpace = dataSpace;
//启动线程
new Thread(this, threadName).start();
} @Override
public void run() {
int i = 0; while (true) {
synchronized (lock) {
//判断是否空间已满
if (count < dataSpace.length) {
//产生者放数据
dataSpace[count] = i++;
System.out.println("[" + Thread.currentThread().getName()
+ "]线程生产了一个数:" + dataSpace[count++]
+ " " + count);
try {
//只是为了看的清楚,沉睡2秒
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒消费者
lock.notify();
} else {
try {
//使自己处于阻塞状态
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
3.建立消费者的类:
package com.mec.about_procuder_customer.core; //消费者
public class Customer extends ProcuderCustomer implements Runnable {
//存放数据的空间
private int[] dataSpace; public Customer(int[] dataSpace, String threadName) {
this.dataSpace = dataSpace;
//启动线程
new Thread(this, threadName).start();
} @Override
public void run() {
while (true) {
//加锁
synchronized (lock) {
//判断是否有数据
if (count > 0) {
System.out.println("[" + Thread.currentThread().getName()
+ "]线程消费了一个数:" + dataSpace[--count]);
//唤醒生产者
lock.notifyAll();
} else {
try {
//使自己处于阻塞状态
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} }
4.测试类:
package com.mec.about_procuder_customer.test; import com.mec.about_procuder_customer.core.Customer;
import com.mec.about_procuder_customer.core.Procuder; public class Test { public static void main(String[] args) {
int[] data = new int[10];
new Procuder(data, "生产者1");
new Procuder(data, "生产者2");
new Customer(data, "消费者");
} }
运行结果:
浅谈Java简单实现的生产者与消费者问题的更多相关文章
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈java性能分析
浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
随机推荐
- js增加、删除、替换DOM对象
当网页被加载时,浏览器会创建页面的文档对象模型DOM,即Document Object Model 整个文档为一个文档节点(document对象) 每个html元素为一个元素节点(element对象) ...
- Bootstrap表单样式
<form class="form-horizontal" role="form"> <fieldset> <legend> ...
- 10: Celery
目录: 1.1 Celery介绍 1.2 celery简单使用 1.3 在项目中如何使用celery 1.4 celery与Django项目最佳实践 1.5 基于步骤1.4:在django中使用计划任 ...
- day5-json和pickle序列化
一.json模块 序列化:把一个对象的形态改变一下,使他能够存放在文件中,或者在网络上传输,序列化也叫持久化,是把对象存储到永久介质中,这样就不会因为掉电而丢失. JSON (JavaScript O ...
- GDI的 点 线 面 双缓冲 位图的绘制
1.输出文本 // 输出文本 ,,)); //设置字体颜色,但最后都要返回原来的字体格式 COLORREF clrBackColor = SetBkColor(hDC, RGB(,,)); //设置背 ...
- kali linux 2.0配置更新源后apt-get update 报错
这个是我/etc/apt/sources.list的更新源: deb http://http.kali.org/kali kali-rolling main contrib non-free deb ...
- Python3 tkinter基础 Frame bind 捕捉多键同时按
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 论文阅读之: Hierarchical Object Detection with Deep Reinforcement Learning
Hierarchical Object Detection with Deep Reinforcement Learning NIPS 2016 WorkShop Paper : https://a ...
- Derek解读Bytom源码-孤块管理
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- VHDL 数字时钟设计
序言 这个是我在做FPGA界的HelloWorld--数字钟设计时随手写下的,再现了数字钟设计的过程 目标分析 时钟具有时分秒的显示,需6个数码管.为了减小功耗采用扫描法显示 按键设置时间,需要对按键 ...