生产者消费者 ProducerConsumer
生产者消费者是常见的同步问题。一个队列,头部生产数据,尾部消费数据,队列的长度为固定值。当生产的速度大于消费的速度时,队列逐渐会填满,这时就会阻塞住。当尾部消费了数据之后,生产者就可以继续生产了。
生产者
package com.example;
import java.util.List;
public class Producer {
private List<String> list;
public Producer(List<String> list){
this.list = list;
}
public void produce(String str){
synchronized (list){
if(list.size() >= ProducerConsumer.LIST_SIZE){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(0, str);
System.out.println("produce item:"+str);
}
}
}
消费者
package com.example;
import java.util.List;
public class Producer {
private List<String> list;
public Producer(List<String> list){
this.list = list;
}
public void produce(String str){
synchronized (list){
if(list.size() >= ProducerConsumer.LIST_SIZE){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(0, str);
System.out.println("produce item:"+str);
}
}
}
测试类
package com.example; import java.util.ArrayList;
import java.util.List; public class ProducerConsumer { public static int LIST_SIZE = 3; public static void main(String[] args){
producerConsumerTest();
} private static void producerConsumerTest(){
List<String> list = new ArrayList<String>();
final Producer producer = new Producer(list);
final Consumer consumer = new Consumer(list); new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while(true){
count++;
producer.produce("num"+count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
while(true){
int count = 0;
while(true){
consumer.consume();
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start(); } }
运行结果:
数据超过3个时候就不能生产了,需要等待消费者。
生产者消费者 ProducerConsumer的更多相关文章
- Linux线程编程之生产者消费者问题
前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一 顺序表循环队列 1.1 ...
- 经典线程同步问题(生产者&消费者)--Java实现
生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费. 为使生产者与消费者之间能够并发执行,在两 ...
- Linux线程编程之生产者消费者问题【转】
转自:http://www.cnblogs.com/clover-toeic/p/4029269.html 前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注 ...
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- Java-J2SE学习笔记-线程-生产者消费者问题
一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java pa ...
- java实现生产者消费者问题
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- java实现生产者消费者问题(转)
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- Java中设计模式之生产者消费者模式-4
引言 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另 ...
- (转)生产者/消费者问题的多种Java实现方式 (待整理)
实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...
随机推荐
- Android样式主题及自定义属性
一.Selector——图形.颜色选择器 语法 <selector> <item android:drawable=“drawableResA” android:state_xx ...
- Android 7.0 新特性
Android7.0提供新功能以提升性能.生产效率和安全性. 关于Android N的性能改进,Android N建立了先进的图形处理Vulkan系统,能少的减少对CPU的占用.与此同时,Androi ...
- Android深入四大组件(九)Content Provider的启动过程
前言 Content Provider做为四大组件之一,通常情况下并没有其他的组件使用频繁,但这不能作为我们不去深入学习它的理由.关于Content Provider一篇文章是写不完的,这一篇文章先来 ...
- Kotlin入门(23)适配器的进阶表达
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象.随着 ...
- python3接收、解析邮件
邮件接收 python3可以使用poplib.POP3进行邮件接收,具体如下: import poplib from email.parser import Parser def get_email( ...
- 获取spring applicationcontext数据连接connection
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ...
- Python3 读写文件
读文件 打开一个文件用open()方法(open()返回一个文件对象): >>> f = open(filename, mode,buffering) #buffering寄存,具体 ...
- Python中函数partial的应用
函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下, 一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用.通过设定参数的默认值,可以降 ...
- 【ZJOI2017】仙人掌
[ZJOI2017]仙人掌 参考博客:https://www.cnblogs.com/wfj2048/p/6636028.html 我们先求出\(dfs\)树(就是\(dfs\)一遍),然后问题就变成 ...
- python 逻辑判断 循环练习题
# 1.判断下列列逻辑语句句的True,False.# 1)1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 ...