生产者消费者模型——wait/notify/notifyAll使用
告警系统架构如下
1、 数据处理系统处理完原始数据并入库后,发送消息到kafka系统;
2、 告警生产者从kafka系统查询消息存入告警消息队列;
3、 告警消费者从告警消息队列查询消息进行处理。
这显然是生产者消费者模型,一个告警消息生产者,多个告警消息消费者。生产者生产消息过快会产生消息积压,生产者生产消息过慢不能充分利用硬件资源。所以必须要生产者和消费者协同处理,使得系统充分利用。具体做法是消息队列为空时,消费者通知生产者生产消息,生产者生产好消息后,通知消费者处理消息。Java中我们使用的对象锁以及wait/notify方法进行线程通信,原理如下:
生产者——循环(获取锁synchronized,释放锁wait(等待被唤醒),生产消息)
消费者——循环(获取锁,消息空则notify/消息不空则消费消息)
消息队列代码:
package com.coshaho.threadpool; import java.util.ArrayList;
import java.util.List; /**
* 消息队列
* @author coshaho
*/
public class MessageQueue
{
List<String> messageList = new ArrayList<String>(); public boolean isEmpty()
{
return messageList.isEmpty();
} /**
* 消费消息
* @return
*/
public String consumeMessage()
{
return messageList.remove(0);
} /**
* 生产消息
* @param msg
*/
public void produceMessage(String msg)
{
messageList.add(msg);
}
}
消费者代码:
package com.coshaho.threadpool; /**
* 消费者,消息队列为空则唤醒生产者
* @author h00219638
*
*/
public class Customer implements Runnable
{
String name;
MessageQueue msgQueue;
public Customer(String name, MessageQueue msgQueue)
{
this.name = name;
this.msgQueue = msgQueue;
} @Override
public void run()
{
while(true)
{
// 消费消息
synchronized(msgQueue)
{
// 如果消息队列为空,唤醒生产者生产消息
if(msgQueue.isEmpty())
{
msgQueue.notify();
}
// 消息队列不为空,则消费消息
else
{
String msg = msgQueue.consumeMessage();
System.out.println("Customer " + name + " consumed message: " + msg + ".");
}
}
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
生产者代码:
package com.coshaho.threadpool; /**
* 生产者,消息队列为空时,消费者会唤醒生产者生产消息
* @author coshaho
*/
public class Producer implements Runnable
{
String name;
MessageQueue msgQueue;
public Producer(String name, MessageQueue msgQueue)
{
this.name = name;
this.msgQueue = msgQueue;
} @Override
public void run()
{
int i = 0;
while(true)
{
synchronized(msgQueue)
{
try
{
// 释放msgQueue的锁,等待消费者唤醒
msgQueue.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// 唤醒后生产消息
for(int j = 0; j < 5; j++)
{
msgQueue.produceMessage("message_" + i + "_" + j);
}
}
System.out.println("Producer " + name + " produced 5 messages.");
}
} }
消息处理进程代码:
package com.coshaho.threadpool; /**
* 消息处理中心
* @author coshaho
*/
public class MessageProcessCenter
{
public static void main(String[] args)
{
// 初始化消息队列
MessageQueue msgQueue = new MessageQueue();
// 运行1个生产者
new Thread(new Producer("Producer", msgQueue)).start(); // 运行3个消费者
new Thread(new Customer("Customer1", msgQueue)).start();
new Thread(new Customer("Customer2", msgQueue)).start();
new Thread(new Customer("Customer3", msgQueue)).start();
}
}
运行结果:
Producer Producer produced 5 messages.
Customer Customer2 consumed message: message_0_0.
Customer Customer3 consumed message: message_0_1.
Customer Customer2 consumed message: message_0_2.
Customer Customer1 consumed message: message_0_3.
Customer Customer3 consumed message: message_0_4.
Producer Producer produced 5 messages.
Customer Customer3 consumed message: message_0_0.
Customer Customer1 consumed message: message_0_1.
Customer Customer2 consumed message: message_0_2.
Customer Customer1 consumed message: message_0_3.
Customer Customer3 consumed message: message_0_4.
Producer Producer produced 5 messages.
Customer Customer3 consumed message: message_0_0.
Customer Customer1 consumed message: message_0_1.
Customer Customer2 consumed message: message_0_2.
Customer Customer3 consumed message: message_0_3.
Customer Customer1 consumed message: message_0_4.
生产者消费者模型——wait/notify/notifyAll使用的更多相关文章
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
- 多线程-4.wait() notify() notifyAll() 生产者消费者模型
1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现
一.多线程模型一:生产者消费者模型 (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Java多线程14:生产者/消费者模型
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Java生产者消费者模型
在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...
- Java实现多线程生产者消费者模型及优化方案
生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...
- 【1】【JUC】Condition和生产者消费者模型
本篇文章将介绍Condition的实现原理和基本使用方法,基本过程如下: 1.Condition提供了await()方法将当前线程阻塞,并提供signal()方法支持另外一个线程将已经阻塞的线程唤醒. ...
随机推荐
- [MySQL]修改root密码的4种方法(以windows为例)
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- Spring Cloud Eureka 服务消费者
参考<spring cloud 微服务实战> 现在已经构建了服务注册中心和服务提供中心,下面就来构建服务消费者: 服务消费者主要完成:发现服务和消费服务.其中服务的发现主要由Eureka的 ...
- Spark2 生存分析Survival regression
在spark.ml中,实现了加速失效时间(AFT)模型,这是一个用于检查数据的参数生存回归模型. 它描述了生存时间对数的模型,因此它通常被称为生存分析的对数线性模型. 不同于为相同目的设计的比例风险模 ...
- 通过JS模拟select表单,达到美化效果[demo][转]
转自: http://www.cnblogs.com/dreamback/p/SelectorJS.html 通过JS模拟select表单,达到美化效果 Demo ------------------ ...
- ABP之仓储
一.仓储的简单介绍 仓储(Repository):这是属于领域层的重要组成部分,它的作用就是完成和数据库的交互工作,仓储里封装了很多操作数据库的方法.所以说仓储是数据映射层和领域层的交互中介.ABP针 ...
- zero-shot learning(ps:每天演好一个情绪稳定的成年人)
my paper~~ 1.(DAP,IAP)Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer 2 ...
- mysql python pymysql模块 增删改查 查询 fetchmany fetchall函数
查询的fetchmany fetchall函数 import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' ...
- mysql 内置功能 触发器介绍
使用触发器可以在用户对表进行[增.删.改]操作时前后定义一些操作,注意:没有查询 创建触发器 create trigger 触发器的名字 之前(before)或者之后(after) 行为(inser ...
- python 面向对象 新式类和经典类
# 经典类写法 # schoolMember.__init__(self, name, age, sex) # 新式类写法 super(Teather, self).__init__(name, ag ...
- gh-ost安装
下载 : https://github.com/github/gh-ost/releases/tag/v1.0.28 先安装Go语言: sudo yum install golang 将gh-ost文 ...