多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll
生产者消费者模式描述的是协调与协作关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)如果桌子空了的话就等待
采用生产者消费者模式可以做到异步,解耦的目的。

public class Produce implements Runnable {
public Object lock;
public LinkedList<String> list;
private volatile boolean isRunning = true;
private static AtomicInteger count = new AtomicInteger();
public Produce(Object object, LinkedList<String> list) {
this.lock = object;
this.list = list;
}
@Override
public void run() {
try {
while (isRunning) {
Thread.sleep();
synchronized (lock) {
while (list.size() >= ) {
System.out.println(Thread.currentThread().getName() + " 正在等待 ");
lock.wait();
}
String value = "data:"+count.getAndIncrement();
list.offerLast(value);
System.out.println(Thread.currentThread().getName() + " 生产数据 "+ value);
lock.notifyAll();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void stop() {
isRunning = false;
}
}
public class Consumer implements Runnable {
private volatile boolean isRunning = true;
public Object lock;
public LinkedList<String> list;// 用list存放生产之后的数据,最大容量为1
public Consumer(Object object, LinkedList<String> list ) {
this.lock = object;
this.list = list;
}
@Override
public void run() {
try {
while (isRunning) {
synchronized (lock) {
while (list.isEmpty()) {
System.out.println(Thread.currentThread().getName() + " 正在等待");
lock.wait();
}
String value = list.pollFirst();
System.out.println(Thread.currentThread().getName() + " 消费数据 >>"+ value);
lock.notifyAll();//
}
Thread.sleep();
}
} catch (Exception e) {
// TODO: handle exception
}
}
public void stop() {
isRunning = false;
}
}
public class Client {
public static void main(String[] args) {
Object lock = new Object();
LinkedList<String> list = new LinkedList<String>();
IntStream.range(, ).forEach(i -> new Thread(new Produce(lock, list), "【生产者" + i + "】").start());
IntStream.range(, ).forEach(i -> new Thread(new Consumer(lock, list), "【消费者" + i + "】").start());
}
}
多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll的更多相关文章
- UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现
UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import ...
- SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)
下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式. 首先我们先创建两个数据库表,分别是user用户表和account账户表 ...
- Unity 人物跟谁手指的移动(第一种方式)
长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管 ...
- 创建多线程的第一种方式——创建Thread子类和重写run方法
创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...
- Struts2框架的数据封装一之属性封装(属性封装的第一种方式:对参数进行封装)
request带着参数来,aciton对其进行处理.在学习action之前,使用的是servlet对request进行处理.request请求时会带有参数,所以我们要对这些参数进行封装. 1. 为什么 ...
- Spring整合Struts2框架的第一种方式(Action由Struts2框架来创建)。在我的上一篇博文中介绍的通过web工厂的方式获取servcie的方法因为太麻烦,所以开发的时候不会使用。
1. spring整合struts的基本操作见我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10140588.html,这里面将spring与struts2 ...
- 创建多线程程序的第一种方式_创建Thread类的子类
创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...
- throws关键字_异常处理的第一种方式(交给别人处理)和try_catch_异常处理的第二种方式(自己处理)
throws关键字:异常处理的第一种方式,交给别人处理 作用: 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象 可以使用throws关键字处理异常对象, 会把异常对象声明抛出给方法的调用 ...
- 五 Mybatis一对一关联查询的两种方式(基于resultType&基于resultMap)
关联查询: 一个用户对应多个订单,一个订单只有一个用户 订单关联用户:两种方式 一:基于resultTYpe,一个与表关系一样的pojo实现 主表订单,从表用户 首先要有一个与关联查询表关系一样的po ...
- 主线程和创建多线程程序的第一种方式_创建Thread类的子类
/** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...
随机推荐
- npropress进度条插件的使用
官网下载地址:http://ricostacruz.com/nprogress/ npropress.css /* Make clicks pass-through */ #nprogress { p ...
- CSP-S 2019 考试分析
Day 0 考试前几天心情比较浮躁,一些题目要调个两三天,还有许多模板题打不对,看来注定凉凉: 坐大巴去日照的路上还打算复习算法来着,没想到我晕车这么厉害,几乎一睁眼就晕,想安安静静的睡会,那个电视播 ...
- python 的小技巧之统计list里面元素的个数
一般写法 def count_list(std:list,tongji): i=0 for item in std: if item==tongji: i+=1 print(i) if __name_ ...
- Linux帮助指令
1.介绍 当我们对某个指令不熟悉时,我们可以使用Linux提供的帮助指令来了解这个指令的使用方法. 2.man 指令获得帮助信息 基本语法 man [命令或者配置文件] (功能描述:获得帮助信 ...
- 设计模式-Iterator
本文参(chao)考(xi)<图解设计模式> 结城浩 (作者) 杨文轩 (译者) 1.Iterator 模式 迭代器作用于集合,是用来遍历集合元素的对象. 迭代器模式提供一种方法顺序访问一 ...
- 第十五周助教工作总结——NWNU李泓毅
助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目需求改进与系统设计:https://www.cnblogs.com/nwnu-daizh/p/ ...
- 解决无法将java项目部署到tomcat中去
project facets java转成web项目 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行. 方法: 1. ...
- 100-continue
https://wiki.open.qq.com/wiki/技术优化原则#1._.E7.A8.8B.E5.BA.8F.E8.AE.BE.E8.AE.A1.E6.97.B6.E9.9C.80.E8.A6 ...
- GIS空间分析案例_图层逐要素导出地理处理工具
GIS空间分析案例_图层逐要素导出地理处理工具 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 目的:导出图层的每个要素 使用方法:指定输入图层 ...
- Spring AOP(通知、连接点、切点、切面)
一.AOP术语 通知(Advice) 切面的工作被称为通知.通知定义了切面是什么以及何时使用.除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题.5种通知类型: 前置通知(Before): ...