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 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
随机推荐
- 会话跟踪技术之COOKIE
会话跟踪技术之COOKIE 一.为什么要用会话控制 我们需要我们的站点可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息. 几个疑问 我先访问A页面后访问B页面,HTTP无法知道是不是同 ...
- Python中的UnboundLocalError是什么错误?如何解决?
在一个月黑风高的夜晚,我们满心欢喜地写出以下代码: money = 10000 # 当前的财产,单位为元 def add_money(value): money += value print('当 ...
- [ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比
https://www.cnblogs.com/yeungchie/ 先说结论:cons > tconc, lconc >> nconc > append1, append a ...
- postman application/json;
看来以后需要都统一使用这个json比较方便. 首先看下 spring boot 项目接口的返回: 当然若不加,他默认可能也是 UTF-8,还是加一下吧.这样就可以了,保证以后 请求和响应的 conte ...
- ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
任务15:oauth2 + oidc 实现 server部分 基于之前快速入门的项目(MvcCookieAuthSample): https://www.cnblogs.com/MingsonZhen ...
- .NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(下)
接下来介绍使用代理方法的方式,也就是说把 ErrorController 整段逻辑直接定义在注册的地方,使用一个匿名委托来处理,这里的逻辑与之前的逻辑是相同的 app.UseExceptionHand ...
- .NET Avalonia开源、免费的桌面UI库 - SukiUI
前言 今天分享一款.NET Avalonia基于MIT License协议开源.免费的桌面UI库:SukiUI. Avalonia介绍 Avalonia是一个强大的框架,使开发人员能够使用.NET创建 ...
- NC15434 wyh的迷宫
题目链接 题目 题目描述 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 .代表空地 现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动, ...
- Java并发编程之美
简介 <Java并发编程之美>分为三部分,第一部分为Java 并发编程基础篇,主要讲解Java 并发编程的基础知识.线程有关的知识和并发编程中的其他相关概念,这些知识在高级篇都会有所使用, ...
- SpringBoot 2.6 和 JUnit 5 的测试用例注解和排序方式
JUnit5 的测试注解 在JUnit5中, 不再使用 @RunWith 注解, 改为使用 @ExtendWith(SpringExtension.class) @ExtendWith(SpringE ...