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线程知识,基础知识就不梳理了,网上也很多,主要关键几个状态位( ...
随机推荐
- 【python】10分钟教你用python下载和拼接微信好友头像图片
前言 相信微信大家是用得再多也不过了.那么,对于python+微信,又能玩出什么新的花样呢?下面小编就给大家带来一个好玩的东西.用python下载所有的微信好友的头像,然后拼接成一张大图.这样,大家就 ...
- Python3之sys模块
一.简介 sys模块用于提供对python解释器的相关操作. 二.常用函数 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules 返回系统导入的模块字段,key是模块 ...
- Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)
Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...
- 190411Python面向对象编程
一.面向对象的概念 类:把一类事物的相同特征抽取出来整合到一起就是一个类,类是一个抽象的概念 对象:基于类创建的一个具体的事物 class People(object): '这是一个人类的类' def ...
- Qt 学习之路 2(73):Qt 线程相关类
Home / Qt 学习之路 2 / Qt 学习之路 2(73):Qt 线程相关类 Qt 学习之路 2(73):Qt 线程相关类 豆子 2013年11月26日 Qt 学习之路 2 7条评论 希 ...
- liunx php-fpm
查看php-fpm 相关信息 查看php-fpm是否开启 :ps -ef|grep php 查看php-fpm的位置:whereis php-fpm 查看php-fpm进程数:ps aux | gre ...
- sharepoint_study_3
SharePoint网页无法打开 描述:安装部署好SharePoint开发环境后,再修改计算机的机器名,重启计算机后,发现SharePoint网站不能打开. 解决:1.将机器名改回去,重启计算机,问题 ...
- POJ1064 Cable master 【二分找最大值】
题目:题目太长了! https://vjudge.net/problem/POJ-1064 题意分析:给了你N根长度为小数形式的棍子,再给出了你需要分的棍子的数量K,但要求你这K根棍子的长度必须是一样 ...
- CF E2 - Array and Segments (Hard version) (线段树)
题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...
- jQuery序列化表单 serialize() serializeArray()
1.serialize()方法 描述:序列化表单内容为字符串,用于Ajax请求. 格式:var data = $(form).serialize(); 2.serializeArray()方法 描述: ...