有很多实现的方法

使用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();
}
}
}
}
}

注意:

  1. 对buffer操作需要同步
  2. buffer没有内容需要阻塞消费者,buffer满了需要阻塞生产者
  3. 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();
}
}

备注:

  1. 使用lock同步线程
  2. 使用lock condition阻塞、唤醒线程

java生产者,消费者的更多相关文章

  1. 基于Java 生产者消费者模式(详细分析)

    Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...

  2. Java生产者消费者的三种实现

    Java生产者消费者是最基础的线程同步问题,java岗面试中还是很容易遇到的,之前没写过多线程的代码,面试中被问到很尬啊,面完回来恶补下.在网上查到大概有5种生产者消费者的写法,分别如下. 用sync ...

  3. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  4. Java生产者消费者模型

    在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...

  5. java 生产者消费者问题 并发问题的解决(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  6. Java 生产者消费者模式详细分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. Java生产者消费者问题

    1. package interview.thread; import java.util.LinkedList; import java.util.Queue; import org.apache. ...

  8. Java生产者消费者模式

    为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能 ...

  9. JAVA生产者消费者的实现

    春节回了趟老家,又体验了一次流水席,由于桌席多,导致上菜慢,于是在等待间,总结了一下出菜流程的几个特点: 1.有多个灶台,多个灶台都在同时做菜出来. 2.做出来的菜,会有专人用一个托盘端出来,每次端出 ...

  10. java生产者消费者并发协作

    随着职务转变,代码荒废很久了,很多时间都是在沟通需求,作为一名技术员,不写代码就感觉是在自废武功,慢慢颓废了很多,今天重新回顾了下JAVA线程知识,基础知识就不梳理了,网上也很多,主要关键几个状态位( ...

随机推荐

  1. 'javac' 不是内部或外部命令,也不是可运行的程序

    win10 系统下'javac' 不是内部或外部命令,也不是可运行的程序 1.在系统变量下面配置 JAVA_HOME:你自己的jdk的路径 CLASSPATH= .;%JAVA_HOME%libdt. ...

  2. php Tp5下mysql的增删改查

    // 增 public function insert(){ $data = array( "username"=>"user121", "pa ...

  3. eclipse中查看java源码时,出现source not found问题

  4. 3.mouseenter和mouseover事件的区别

    <html> <head> <meta charset="UTF-8"> <script src="jquery-3.3.1.j ...

  5. Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)

    不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...

  6. [POI2007]MEG-Megalopolis 树的dfs序+树状数组维护差分 BZOJ1103

    题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postman, who onc ...

  7. Qt 学习之路 2(33):贪吃蛇游戏(3)

    Qt 学习之路 2(33):贪吃蛇游戏(3) 豆子 2012年12月29日 Qt 学习之路 2 16条评论 继续前面一章的内容.上次我们讲完了有关蛇的静态部分,也就是绘制部分.现在,我们开始添加游戏控 ...

  8. payload指安全测试数据

    payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始 ...

  9. [BZOJ 4850][Jsoi2016]灯塔

    传送门 #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) ...

  10. CDQZ Day1

    #include<cassert> #include<cstdio> #include<vector> using namespace std; ,maxt=,ma ...