消费者生产模式

原创 2015年11月18日 21:40:39

学JAVA的时候一直对线程这个地方没有理解很,最近再把理论复习了一遍,写了下经典问题,做个记录

此处线程用了两种方式创建线程,基本方法和线程池

synchronized关键字的一些说明:一个同步方法在执行之前需要加锁。具体一些就是,在调用一个对象的同步实例方法要求给对象加锁,调用一个类的同步静态方法要求对该类加锁。

此外,在JAVA5中,锁和条件为新内容,Lock,Condition,await(), signal()的配合使用,可以替换synchrozied是线程安全



import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//程序使用内部类嵌套
public class ConsumerProducer {

private static Buffer buffer = new Buffer();//创建仓库

public static void main(String[] args) {

/* 基本线程初始化
* Runnable r1 = new ProduceTask();
Runnable r2 = new ConsumeTask();

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1.start();
t2.start();*/

//使用创建线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(new ProduceTask());
executor.execute(new ConsumeTask());
}

//生产行为
private static class ProduceTask implements Runnable{
public void run() {
while(true){
int produce_num = (int)(Math.random() * 10);
System.out.println("生产:" + produce_num);
buffer.prodeuce(produce_num);
try {
Thread.sleep((int)(Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//消费行为
private static class ConsumeTask implements Runnable{
public void run() {
while(true){
int consume_num = (int)(Math.random() * 10);
System.out.println("消费:" + consume_num);
buffer.consume(consume_num);
try {
Thread.sleep((int)(Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//仓库
private static class Buffer{
private static final int CAPACITY = 100;
private int Current_Num = 0;

//生产
public synchronized void prodeuce(int value){
while(Current_Num + value > CAPACITY){
System.out.println("容量已到达上限,请等待。。。。");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Current_Num += value;
System.out.println("当前容量为:" + Current_Num);
notifyAll();
}

//消费
public synchronized void consume(int value){
while(Current_Num - value < 0){
System.out.println("容量即将为0,请等待。。。。");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Current_Num -= value;
System.out.println("当前容量为:" + Current_Num);
notifyAll();
}
}
}












生产者/消费者模式之深入理解

★简介    在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者...
  • sanyuesan0000
  • sanyuesan0000
  • 2016年11月01日 15:52
  • 2321

生产者/消费者模式(阻塞队列)

生产者/消费者模式(阻塞队列) 博客分类:  j2EE 制造thread多线程软件测试JDK  生产消费者模式  貌似也是阻塞的问题  花了一些时间终于弄明白这个鸟...
  • autumn20080101
  • autumn20080101
  • 2013年07月26日 08:48
  • 37873

消费者模式的三种实现方式

1、使用 2、使用jdk
  • HEYUTAO007
  • HEYUTAO007
  • 2014年08月20日 22:16
  • 1503

C# 系统日志处理-生产者与消费者模式

系统日志的处理,使用生产者与消费者模式以及单例模式来提升系统性能,作为学习设计模式的例子...
  • tuchangsheng801004
  • tuchangsheng801004
  • 2015年07月10日 17:01
  • 1656

如何实现生产者消费者模式

生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”、“消费者”、“仓库”和“产品”。他们之间的关系如下: ① 生产者仅仅在仓储未满时候生产,仓满则停止生产。 ② 消费者仅仅在仓储...
  • u010339647
  • u010339647
  • 2016年07月24日 11:33
  • 3996

android生产者消费者模式

生产者消费者模式 生产者->仓库->消费者 生产者一直在生产放入仓库中。消费者一直从仓库中取出来消费。线程同步 package shengchan.xiaofei; import android.a...
  • kyrinleo
  • kyrinleo
  • 2014年01月13日 11:50
  • 1352

Android中简易实现生产者和消费者问题

1
  • u010712277
  • u010712277
  • 2016年11月21日 22:17
  • 494

并发设计模式之生产者-消费者模式

点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良...
  • liuchuo
  • liuchuo
  • 2016年11月25日 14:10
  • 1075

JAVA 生产者消费者模式的实现

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:     P(S):①将信号量S的值减...
  • ftx2540993425
  • ftx2540993425
  • 2016年03月07日 16:33
  • 1063

生产者,消费者的几个例子

在多线程中传递数据,免不了要用生产者,消费者模式,几个例子: Java: public class BlockingQueueInputStream extends InputStream { p...
  • ffmpeg4976
  • ffmpeg4976
  • 2016年08月12日 13:20
  • 435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:消费者生产模式
举报原因:
原因补充:

(最多只允许输入30个字)