消费者生产模式

原创 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();
}
}
}












版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

线程间的通信-生产消费者模式

JAVA线程间通信问题 有很多现实问题要求不仅要同步的访问同一共享资源,而且线程间还彼此牵制,通过相互通信来向前推进。那么,多个线程之间是如何进行通信的呢? 解决思路 在现实应用中,很多时候都需要让多...
  • yxpjx
  • yxpjx
  • 2011-04-08 18:27
  • 1006

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程、数据缓冲区在文件读写应用等。强大的模型框架,鉴于本人水平有限目前...

wait/notify实现生产消费者模式

存储类GoodStorage:import java.util.ArrayList; import java.util.List; public class GoodStorage { priva...

JAVA-16.2-生产消费者模式

线程间通信(生产消费者问题):不同类型线程针对同一个资源的操作   举例:1.系统不仅要卖票还要入票      2.不仅要卖肉夹馍还要生产肉夹馍 今天主要讲解单生产单消费模式。   如果我...

10W级数据更新操作__生产消费者模式

背景需求 最近有这么一个需求:由于本地系统信息与另一个系统数据可能不一致,两个系统有各自的独立数据库和业务,在通信过程中网络等原因,导致两者之间的关键信息有差异,因此本地数据库中可能有10W条记录...

生产者-消费者生产模式 在医疗器械当中的使用

生产者-消费者理论: 什么是生产者消费者模式 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的...

生产、消费者模式

package com.alipay.dtcrawler;import com.alipay.dtcrawler.core.service.page.Html; import com.alipay....

Java生产消费者模式之项目实践

浅谈生产消费者模式在项目中的一次应用案例

Kafka下的生产消费者模式与订阅发布模式

生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文在总结了Kafka基本概念的基础上,以“数据接入”和“事件分发”这两个场景为例,来探讨Kafka...
  • zwgdft
  • zwgdft
  • 2017-01-21 17:27
  • 5615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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