告警系统架构如下

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使用的更多相关文章

  1. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...

  2. 多线程-4.wait() notify() notifyAll() 生产者消费者模型

    1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...

  3. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  4. 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

    一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...

  5. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  6. Java多线程14:生产者/消费者模型

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  7. Java生产者消费者模型

    在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...

  8. Java实现多线程生产者消费者模型及优化方案

    生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...

  9. 【1】【JUC】Condition和生产者消费者模型

    本篇文章将介绍Condition的实现原理和基本使用方法,基本过程如下: 1.Condition提供了await()方法将当前线程阻塞,并提供signal()方法支持另外一个线程将已经阻塞的线程唤醒. ...

随机推荐

  1. HTML5 Canvas 画虚线组件

    前段时间由于项目需要,用到了HTML5 Canvas画图,但是没有画虚线的方法,自己写了一个HTML5 画虚线的组件. dashedLine.js if (window.CanvasRendering ...

  2. 【BZOJ1210】[HNOI2004]邮递员 插头DP+高精度

    [BZOJ1210][HNOI2004]邮递员 Description Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局.他所管辖的邮筒非常巧地排成了 ...

  3. Android Meterial Design Support Library

    extends:http://inthecheesefactory.com/blog/android-design-support-library-codelab At the moment I be ...

  4. dhroid - Dhdb orm简化sqlite数据库操作

    android数据库其实使用的不多,dhroid框架中的网络缓存使用了数据库我就写了也写了一个数据库操作工具 dhroid 数据库基本还是单表操作多,为了简单我只做了单表,那些级联,懒加载,什么的分两 ...

  5. Ubuntu 16.04系统下软件中心Software闪退解决办法

    按住Ctrl+Alt+T打开终端输入: sudo apt-get update //更新 sudo apt-get dist-upgrade //升级 sudo apt-get install --r ...

  6. [ZT] matlab中plot画图参数的设置

    一.Matlab绘图中用到的直线属性包括: (1)LineStyle:线形 (2)LineWidth:线宽 (3)Color:颜色 (4)MarkerType:标记点的形状 (5)MarkerSize ...

  7. 【微信小程序】---线上环境搭建

    一.前言 通常我们在本地电脑上开发微信小程序,调用和访问小程序会有很多问题.特别是在配有自己后端的情况下,我们通过真机访问我们的小程序会出现不可访问的问题 二.线上环境搭建 在这里我们主要以腾讯云给大 ...

  8. 170815、redis3.0安装配置

    下载地址http://redis.io/download 安装步骤: 1 首先需要安装gcc,把下载好的redis-3.0.0-rc2.tar.gz 放到linux /usr/local文件夹下 2 ...

  9. python----字符编码与文件处理

    字符编码 计算机工作就要通电,也就是说‘电‘驱使计算机干活,而电只有高电压(二进制1),低电压(二进制0),也就是说计算机只认数字. 编程的目的就是让计算机干活,编程的结果就是一堆字符,也就是我们编程 ...

  10. 判断一个正整数是否是2的N次方的简洁算法及其证明

    在写代码时遇到了“判断一个正整数是否是2的N次方”的问题,不想调用 java.lang 的 Math 类库进行浮点运算,觉得转换为浮点不是个好办法. 遂在网上搜索了一下,发现有人列出来好几种写法,列举 ...