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线程知识,基础知识就不梳理了,网上也很多,主要关键几个状态位( ...
随机推荐
- bzoj2115(线性基)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 题意:求图中路径1~n上最大边权 xor 和 思路:参见 blog http://b ...
- 洛谷P4009 汽车加油行驶问题(分层最短路)
传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...
- 简单的IDEA破解到2099年
原文链接:https://www.cnblogs.com/duende99/p/10038640.html 破解方式有2种,第一种比较方便 第一种比较方便1.使用注册码破解:http://idea.l ...
- bzoj 3895: 取石子
$ \color{#0066ff}{ 题目描述 }$ Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选 ...
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
标签: SQL合并数据 2013-08-21 10:41 489人阅读 评论(0) 收藏 举报 分类: Oracle数据库(14) select * into 新表名 from (select ...
- 2A - Stone
任意一堆移动过后的石子都是整数x的倍数, 那么石子总数显然也应该是x的倍数, 换句话说,x必为石子数总和的一个质因子. 题目要求移动次数尽量小,那么x也应该尽量小. 所以选择石子数总和的最小质因子. ...
- fork 炸弹
一段古老的Linux shell程序 :() { :|:& };: 这是bash shell的写法,首先定义了一个函数:(),花括号里面是函数体,这里递归执行函数本身,通过管道在后台再递归运行 ...
- git 各个区的区别
Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited) 把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用 git add 把文 ...
- rest-assured的默认值与Specification重用
一.默认值 rest-assured发起请求时,默认使用的host为localhost,端口为8080,如果你想使用不同的端口,你可以这样做: given().port(80)...... 或者是简单 ...
- LightOJ - 1245 根号n暴力
打表或者画个图可以看出i>根号n时每个i的贡献值相差很小,可以利用公式优化(函数C) 但是注意不能一整段使用公式,否则复杂度还是会劣化到O(n)(显然对gongxian只能逐步递减) 网上看了不 ...