`
lhc1986
  • 浏览: 160638 次
  • 性别: Icon_minigender_1
  • 来自: 帝都
社区版块
存档分类
最新评论

java并发控制经典场景-生产者/消费者

阅读更多

java并发控制四种方法:

1.wait()/notify();

2. await() / signal() ;

3.BlockingQueue 阻塞队列方法;

4.PipedInputStream / PipedOutputStream


最常用的是wait()/notify(),简单demo见代码:

 

 

仓库类:

import java.util.LinkedList;

public class Storage {

	public static final int MAX_SIZE = 100;

	private LinkedList<Object> list = new LinkedList<Object>();

	public void produce(int num) {
		synchronized (list) {
			while (num + list.size() > Storage.MAX_SIZE) {
				System.out.println("要生产的产品数量:" + num + "库存量"
						+ list.size() + "暂不能执行生产任务");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 0; i < num; i++) {
				list.add(new Object());
			}
			System.out.println("已经生产产品数:" + num + "现库存量为:" + list.size());
			list.notifyAll();
		}
	}

	public void consume(int num) {
		synchronized (list) {
			while (num > list.size()) {
				System.out.println("要消费的产品数量:" + num + "库存量:"
						+ list.size() + "暂时不能执行消费任务!");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 1; i <= num; ++i) {
				list.remove();
			}

			System.out.println("已经消费产品数:" + num + "现库存量为:" + list.size());

			list.notifyAll();
		}
	}

	public LinkedList<Object> getList() {
		return list;
	}

	public void setList(LinkedList<Object> list) {
		this.list = list;
	}
	
}

 生产者类:

public class Producer implements Runnable {
	private int num;
	
	private Storage storage;
	
	public Producer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.produce();
	}
	
	public void produce(){
		this.storage.produce(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}

}

 消费者类:

public class Consumer implements Runnable {
	
	private int num;
	
	private Storage storage;
	
	public Consumer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.consume();
	}
	
	private void consume(){
		this.storage.consume(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}
	
	
	
}

 测试方法类:

public class SysTest {
	public static void main(String[] args) {
		Storage storage = new Storage();
		Producer pt1 = new Producer(storage);
		pt1.setNum(10);
		Producer pt2 = new Producer(storage);
		pt2.setNum(10);
		Producer pt3 = new Producer(storage);
		pt3.setNum(10);
		Producer pt4 = new Producer(storage);
		pt4.setNum(10);
		Producer pt5 = new Producer(storage);
		pt5.setNum(10);
		Producer pt6 = new Producer(storage);
		pt6.setNum(10);
		Producer pt7 = new Producer(storage);
		pt7.setNum(80);
		
		
		Thread p1 = new Thread(pt1);
		Thread p2 = new Thread(pt2);
		Thread p3 = new Thread(pt3);
		Thread p4 = new Thread(pt4);
		Thread p5 = new Thread(pt5);
		Thread p6 = new Thread(pt6);
		Thread p7 = new Thread(pt7);
		
		
		Consumer ct1 = new Consumer(storage);
		ct1.setNum(50);
		Consumer ct2 = new Consumer(storage);
		ct2.setNum(20);
		Consumer ct3 = new Consumer(storage);
		ct3.setNum(30);
		
		Thread c1 = new Thread(ct1);
		Thread c2 = new Thread(ct2);
		Thread c3 = new Thread(ct3);
		
		
		c1.start();
		c2.start();
		c3.start();
		
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
		
	}
}

 结果:

要消费的产品数量:50库存量:0暂时不能执行消费任务!
要消费的产品数量:30库存量:0暂时不能执行消费任务!
已经生产产品数:10现库存量为:10
要消费的产品数量:30库存量:10暂时不能执行消费任务!
要消费的产品数量:20库存量:10暂时不能执行消费任务!
要消费的产品数量:50库存量:10暂时不能执行消费任务!
已经生产产品数:10现库存量为:20
已经生产产品数:10现库存量为:30
已经生产产品数:10现库存量为:40
要消费的产品数量:50库存量:40暂时不能执行消费任务!
已经消费产品数:20现库存量为:20
要消费的产品数量:30库存量:20暂时不能执行消费任务!
已经生产产品数:10现库存量为:30
要消费的产品数量:50库存量:30暂时不能执行消费任务!
要生产的产品数量:80库存量30暂不能执行生产任务
已经消费产品数:30现库存量为:0
已经生产产品数:10现库存量为:10
已经生产产品数:80现库存量为:90
已经消费产品数:50现库存量为:40

分享到:
评论

相关推荐

    Java并发编程(学习笔记).xmind

    生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...

    JAVA编程之Spring-activeMQ基础开发

    并比较了两种模式:生产者-消费者模式和发布-订阅模式的区别。 包含的特性如下: 1.开启activeMQ,访问http://localhost:8080/demo 2 在项目中,我们为消息的生产者和发布者分别注册了两个消费者和订阅者,当有消息...

    aliyun-log-java-producer:阿里云LOG Java生产者

    阿里云LOG Java生产者Aliyun LOG Java Producer是一个易于使用且高度可配置的Java类库,专门为运行在大数据,高并发场景下的Java应用量身打造。功能特点线程安全-生产者接口暴露的所有方法都是线程安全的。初级发送-...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    Java八股文最新消息中间件面试宝典

    包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。 **面试官**:RabbitMQ-如何...

    java多线程与并发库高级处理.txt

    如果对什么是线程、什么...说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。

    联通SGIP1.2短信网关 发送接收短信皆可 可以应对高并发

    - 上行短信(接收手机用户的短信),实际是接收联通短信中心SMG发过来的信息,为了应对高并发的场景,使用了生产者和消费者典型的多线程设计方案,用线程池去管理多线程,需要改动相关代码,找到类SCIPServer修改即可,接收...

    Java思维导图xmind文件+导出图片

    Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...

    java开发oa系统源码下载-Spring-rabbitMQ:Spring整合消息队列RabbitMQ

    并比较了两种模式:生产者-消费者模式和发布-订阅模式的区别。AMQP作为比JMS更加高级的消息协议,支持更多的消息路由和消息模式。 包含的特性如下:   如上图,生产者消费者模型:添加了一个队列,并创建了两个消费...

    Java典型模块

    第7章 生产者与消费者问题(线程通信知识) 7.1 生产者与消费者原理 7.1.1 项目结构框架分析 7.1.2 项目功能业务分析 7.2 无线程通信的生产者与消费者项目 7.2.1 生产者类 7.2.2 消费者类 7.2.3 储存库类 7.2.4 测试...

    ActiveMQ基础知识

    ActiveMQ是一个消息代理服务器,能够将消息从生产者传递到消费者,提供了高效、可靠、灵活的消息传递机制。下面是.ActiveMQ基础知识的详细介绍: 1. ACTIVEMQ 基本介绍 ActiveMQ是一个开源的消息中间件,提供了...

    leetcode跳跃-algorithm-coding-golang:算法编码-golang

    生产者消费者模型 常见考题代码 leetcode 22 括号生成 (回溯) leetcode 55 跳跃游戏 (贪心) leetcode 300 最长上升子序列 (动态规划) 其他 littleGame 摸鱼小游戏 TODO 简单爬虫爬取网页信息 推荐常用解题模板...

    xd-toolkit:工具集(工作过程中常用到的工具类、工具模块)

    a、很多业务场景都是单生产者多消费者的模式,这个模式除了生产者的业务逻辑与消费者的业务逻辑 不一样外,其他的其实都是通用的,这个组件就是为了这个场景而存在,避免重造轮子 b、对于业务逻辑简单,要求高并发高...

    Wws_Android_Interview

    生产者-消费者模型 线程池的实现方式 Jvm相关(参考《深入理解JVM》)(两天1.23-1.24)(实际1.27-1.31) 垃圾回收机制 分代回收算法 垃圾回收算法 类加载过程(双亲委托) 补充: JMM(Java内存结构模型) ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Java中的多线程你只要看这一篇就够了

    说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都对其中的一些...

Global site tag (gtag.js) - Google Analytics