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
分享到:
相关推荐
生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...
并比较了两种模式:生产者-消费者模式和发布-订阅模式的区别。 包含的特性如下: 1.开启activeMQ,访问http://localhost:8080/demo 2 在项目中,我们为消息的生产者和发布者分别注册了两个消费者和订阅者,当有消息...
阿里云LOG Java生产者Aliyun LOG Java Producer是一个易于使用且高度可配置的Java类库,专门为运行在大数据,高并发场景下的Java应用量身打造。功能特点线程安全-生产者接口暴露的所有方法都是线程安全的。初级发送-...
│ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...
│ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...
包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。 **面试官**:RabbitMQ-如何...
如果对什么是线程、什么...说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。
- 上行短信(接收手机用户的短信),实际是接收联通短信中心SMG发过来的信息,为了应对高并发的场景,使用了生产者和消费者典型的多线程设计方案,用线程池去管理多线程,需要改动相关代码,找到类SCIPServer修改即可,接收...
Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...
并比较了两种模式:生产者-消费者模式和发布-订阅模式的区别。AMQP作为比JMS更加高级的消息协议,支持更多的消息路由和消息模式。 包含的特性如下: 如上图,生产者消费者模型:添加了一个队列,并创建了两个消费...
第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基础知识的详细介绍: 1. ACTIVEMQ 基本介绍 ActiveMQ是一个开源的消息中间件,提供了...
生产者消费者模型 常见考题代码 leetcode 22 括号生成 (回溯) leetcode 55 跳跃游戏 (贪心) leetcode 300 最长上升子序列 (动态规划) 其他 littleGame 摸鱼小游戏 TODO 简单爬虫爬取网页信息 推荐常用解题模板...
a、很多业务场景都是单生产者多消费者的模式,这个模式除了生产者的业务逻辑与消费者的业务逻辑 不一样外,其他的其实都是通用的,这个组件就是为了这个场景而存在,避免重造轮子 b、对于业务逻辑简单,要求高并发高...
生产者-消费者模型 线程池的实现方式 Jvm相关(参考《深入理解JVM》)(两天1.23-1.24)(实际1.27-1.31) 垃圾回收机制 分代回收算法 垃圾回收算法 类加载过程(双亲委托) 补充: JMM(Java内存结构模型) ...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都对其中的一些...