java生产者消费者模式代码示例
package test;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
R r = new R();
P p1 = new P(r,10);
P p2 = new P(r,20);
P p3 = new P(r,30);
P p4 = new P(r,40);
P p5 = new P(r,50);
C c1 = new C(r,10);
C c2 = new C(r,20);
C c3 = new C(r,30);
C c4 = new C(r,40);
C c5 = new C(r,50);
new Thread(p1).start();
new Thread(c1).start();
new Thread(p2).start();
new Thread(c2).start();
new Thread(p3).start();
new Thread(c3).start();
new Thread(p4).start();
new Thread(c4).start();
new Thread(p5).start();
new Thread(c5).start();
}
}
class P implements Runnable{
private R r;
private int n;
public P(R _r,int _n){
this.r = _r;
this.n = _n;
}
@Override
public void run() {
r.push(n);
}
}
class C implements Runnable{
private R r;
private int n;
public C(R _r,int _n){
this.r = _r;
this.n = _n;
}
@Override
public void run() {
r.pop(n);
}
}
class R {
private LinkedList<Object> c = new LinkedList<Object>();
private static final int MAX_SIZE = 100;
public void push(int n){
synchronized (c) {
if(c.size()+n <= MAX_SIZE){
for(int i=0;i<n;i++){
c.add(new Object());
}
System.out.println("生产者:生产了"+n+"个产品,现在一共有"+c.size()+"个产品,并唤醒消费者线程控可以消费了!!!!!!!");
c.notifyAll();
}else{
System.out.println("生产者:要生产的产品个数:"+n+",大于仓库剩余空间"+(MAX_SIZE-c.size())+"当前生产者线程进入等待状态。。。。。。。。。。");
try {
c.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void pop(int n){
synchronized (c) {
if(n <= c.size()){
for(int i=0;i<n;i++){
c.remove();
}
System.out.println("消费者:消费了"+n+"个产品,现在还剩下"+c.size()+"个产品,并唤醒生产者线程控可以生产了!!!!!!!");
c.notifyAll();
}else{
System.out.println("消费者:要消费的产品个数:"+n+",大于仓库剩余产品个数"+c.size()+"当前消费者线程进入等待状态。。。。。。。。。。");
try {
c.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
java生产者消费者模式代码示例的更多相关文章
- 基于Java 生产者消费者模式(详细分析)
Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...
- Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...
- Java 生产者消费者模式详细分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java生产者消费者模式
为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能 ...
- java生产者消费者问题代码分析
作者要的是一个生产者生成,接着必须有一个消费者消费,那这不是需要单线程吗?或者使用1个大小的阻塞队列.所以只谈论问题本身,不谈论好不好. 具体代码: import java.util.concurre ...
- java生产者/消费者模式实现——一生产者一消费者(操作值)
胶多不粘话多不甜,直接上代码: 生产者类: /** * Created by 51304 on 2016/2/28. */ public class P { private String lock; ...
- Java并发(基础知识)—— 阻塞队列和生产者消费者模式
1.阻塞队列 Blocki ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- Java多线程-----实现生产者消费者模式的几种方式
1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
随机推荐
- IT技术:开篇 - IT技术系列文章
笔者已经工作了十多年,在这十多年里,笔者在博客上也对自己所学的技术方面的事情记录成了博文.这些博文有些是笔者自己所学所记,有些是将网上的博文进行的转载.在经历了这么多的技术学习之后,笔者将自己的经验记 ...
- 文心一言 VS 讯飞星火 VS chatgpt (193)-- 算法导论14.3 1题
一.用go语言,写出作用于区间树的结点且在 〇(1) 时间内更新 max 属性的过程 LEFT-ROTATE 的伪代码. 文心一言: 以下是一个简单的LEFT-ROTATE的伪代码,它对一个二叉搜索树 ...
- Delphi2010中TResourceStream流使用
Resource可以是任意文件(图像.声音.office都可以),直接打包到编译的exe文件中,调用也非常方便 打开一个新的或已有的delphi工程 1.先在 Project->resource ...
- DbgridEh表格框的【可连续点击两次编辑设置,和不允许点击两次编辑的设置】
- UVA12390 Distributing Ballot Boxes 题解
题目传送门 题意 有 \(n\) 个城市,\(b\) 个投票箱,第 \(i\) 个城市有 \(a_i\) 人,每个人均有一张票,将 \(b\) 个投票箱分给 \(n\) 个城市,每个城市的票分摊在投票 ...
- RocketMQ—RocketMQ消息重复消费问题
RocketMQ-RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题: 生产者多次投递消息:如果生产者发送消息时,连接有延迟,MQ还没收到消息,生产者又发送了一次消息 ...
- springboot项目读取自定义的properties文件
现在我们要在某个地方读取config.properties里的这几个属性值 这里使用三个注解即可读取自定义的配置文件内容(注意这里需要写他的setter和getter方法) @Component #注 ...
- js根据输入字符长度自动调整textarea高度
1.编写html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 神经网络优化篇:详解TensorFlow
TensorFlow 先提一个启发性的问题,假设有一个损失函数\(J\)需要最小化,在本例中,将使用这个高度简化的损失函数,\(Jw= w^{2}-10w+25\),这就是损失函数,也许已经注意到该函 ...
- day03--实际操作演示linux系统挂载过程
# 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...