java生产者,消费者
有很多实现的方法
使用blockingqueue实现
demo
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by 58 on 2017/11/27.
*/
public class proandconsu {
private static LinkedBlockingQueue<Integer> buffer = new LinkedBlockingQueue<Integer>(5);
public static void main(String[] args) {
Thread c = new Thread(new Consumer());
Thread p = new Thread(new Produceer());
c.start();
p.start();
Thread m = new Thread(new MonitorBuffer());
m.start();
}
//消费者
static class Consumer implements Runnable{
//每隔两秒消费一个产品
public void run() {
while(true){
try {
int product = buffer.take();
System.out.println("consume a product: " + product);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
static class Produceer implements Runnable{
//每隔一秒钟生成一个产品
public void run() {
int product = 0;
while (true){
System.out.println("produce one product.");
try {
buffer.put(product);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//定时监控buffer数量
static class MonitorBuffer implements Runnable{
public void run() {
while(true){
System.out.println("buffer size : " + buffer.size());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
注意:
- 对buffer操作需要同步
- buffer没有内容需要阻塞消费者,buffer满了需要阻塞生产者
- linkedblockingqueue通过reentralock、wait、notify实现了上面两个要求
自定义容器实现生产者消费者
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by 58 on 2017/11/27.
* 使用自定义的buffer
* 1. 同步生产者消费者对buffer的操作
* 2. buffer满了,要阻塞生产者,buffer空了,要阻塞消费者
*/
public class ProandConsuUsingSelfDefineBuffer {
private static Buffer<Integer> buffer = new Buffer<Integer>(5);
public static void main(String[] args) {
Thread c = new Thread(new Consumer());
Thread p = new Thread(new Producer());
c.start();
p.start();
Thread m = new Thread(new MonitorBuffer());
m.start();
}
//消费者
static class Consumer implements Runnable{
public void run() {
while(true){
try {
int product = buffer.take();
Thread.sleep(2000);
System.out.println("consumer consume product: " + product);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
static class Producer implements Runnable{
public void run() {
int product = 1;
while(true){
try {
buffer.put(product);
Thread.sleep(1000);
System.out.println("producer create product.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//监控buffer大小
static class MonitorBuffer implements Runnable{
public void run() {
while(true){
System.out.println("buffer size: " + buffer.size());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 缓冲池
* */
class Buffer<T>{
private List<T> container = new ArrayList<T>();
private int size;
private int defaultSize = 10;
private static Lock lock = new ReentrantLock();
private static Condition notFull = lock.newCondition();
private static Condition notEmpty = lock.newCondition();
public Buffer() {
this.size = defaultSize;
}
public Buffer(int size) {
this.size = size;
}
//生产者往里面放内容
public void put(T product) throws InterruptedException {
lock.lock();
while(container.size() >= size){
notFull.await();
}
container.add(product);
if(container.size() > 0){
notEmpty.signal();
}
lock.unlock();
}
//消费者消费内容
public T take() throws InterruptedException {
lock.lock();
while(container.size() <= 0){
notEmpty.await();
}
T product = container.remove(container.size() - 1);
if(container.size() < size){
notFull.signal();
}
lock.unlock();
return product;
}
public int size(){
return container.size();
}
}
备注:
- 使用lock同步线程
- 使用lock condition阻塞、唤醒线程
java生产者,消费者的更多相关文章
- 基于Java 生产者消费者模式(详细分析)
Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...
- Java生产者消费者的三种实现
Java生产者消费者是最基础的线程同步问题,java岗面试中还是很容易遇到的,之前没写过多线程的代码,面试中被问到很尬啊,面完回来恶补下.在网上查到大概有5种生产者消费者的写法,分别如下. 用sync ...
- java 生产者消费者问题 并发问题的解决
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- Java生产者消费者模型
在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...
- java 生产者消费者问题 并发问题的解决(转)
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- Java 生产者消费者模式详细分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java生产者消费者问题
1. package interview.thread; import java.util.LinkedList; import java.util.Queue; import org.apache. ...
- Java生产者消费者模式
为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能 ...
- JAVA生产者消费者的实现
春节回了趟老家,又体验了一次流水席,由于桌席多,导致上菜慢,于是在等待间,总结了一下出菜流程的几个特点: 1.有多个灶台,多个灶台都在同时做菜出来. 2.做出来的菜,会有专人用一个托盘端出来,每次端出 ...
- java生产者消费者并发协作
随着职务转变,代码荒废很久了,很多时间都是在沟通需求,作为一名技术员,不写代码就感觉是在自废武功,慢慢颓废了很多,今天重新回顾了下JAVA线程知识,基础知识就不梳理了,网上也很多,主要关键几个状态位( ...
随机推荐
- RESTful API概念解析
什么是restful? REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”. ...
- 题解 P1255 【数楼梯】
题目链接 好吧,承认python 轻松水过 代码奉上: n = int(input()) #定义,输入 a=1 #初始的变量赋值 b=1 n-=1 #我的毒瘤的循环不得不加上这句话 if n > ...
- Windows NLB搭配IIS的ARR搭建高可用环境(转载)
原文地址:http://www.cnblogs.com/shanyou/archive/2010/04/28/1723276.html 在现行的许多网络应用中,有时一台服务器往往不能满足客户端的要求, ...
- 下载azure website的code
1.登陆kudu直接下载. http://www.concurrency.com/blog/use-azure-kudu-debug-azure-websites/ 2.FTP链接拷贝(可以忽略) 3 ...
- Unity小知识---第三人称中设置摄像机的简单跟随
第三人称中设置摄像机的简单跟随 private Transform player; private Vector3 offect; private float smooothing = 3f; //插 ...
- SDUT OJ 数据结构实验之排序四:寻找大富翁
数据结构实验之排序四:寻找大富翁 Time Limit: 200 ms Memory Limit: 512 KiB Submit Statistic Discuss Problem Descripti ...
- Kibana源码分析--Hapijs路由设置理解笔记
[ES6解构赋值]:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_ ...
- URL 地址传中文,转码
地址传中文,转码 http://community.csdn.net/Expert/topic/4541/4541877.xml?temp=.57688541.设置web.config文件.<s ...
- 118th LeetCode Weekly Contest Pancake Sorting
Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...
- springLdap 操作ldap示例(增删改查)
转自:http://blog.csdn.net/sundenskyqq/article/details/9002440 这部分的示例网上的确有很多,但是个人在查找的过程中还是感到不够满意,所以就自己总 ...