您的位置:首页 > 编程语言 > Java开发

回首Java——编程思想之消息机制

2017-11-21 19:11 239 查看

什么是消息?

何为消息?消息就是带有某种信息的信号,如你用鼠标点击一个窗口会产生鼠标的消息,键盘输入字符会产生键盘的消息,一个窗口大小的改变也会产生消息。

消息从何而来?根据冯·诺依曼的体系结构计算机有运算器、存储器、控制器和输入设备和输出设备五大部件组成,消息主要来自输入设备,如键盘、鼠标、扫描仪等,也可来自已窗口和操作系统。

消息机制的三大要点:消息队列、消息循环(分发)、消息处理。其结构如下:



队列和消息队列?

消息队列就是存放消息的一种队列(queue),每产生一个消息都会添加进消息队列中。队列是一种特殊的线性表,这种线性表可以用数组实现,也可以用链表实现,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。,具有先进先出的特点。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

消息循环

消息循环就是通过循环(如while)不断地从消息队列中取得队首的消息,并将消息分发出去。

消息处理

消息处理就是在接收到消息之后根据不同的消息类型做出不同的处理。

事件

事件是根据接收到的消息的具体信息做出的特定的处理,放在代码中是事件响应函数。

代码举例

这里用一个生产者和消费者的例子来模拟产生消息和消费消息。对于下面这个例子

(代码来源)

应该明确一下几点:

1、生产者仅仅在仓储未满时候生产,仓满则停止生产。

2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。

3、当消费者发现仓储没产品可消费时候会通知生产者生产。

4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class ProducerConsumer {
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();

Storage s = pc.new Storage();

ExecutorService service = Executors.newCachedThreadPool();
Producer p = pc.new Producer("张三", s);
Producer p2 = pc.new Producer("李四", s);
Consumer c = pc.new Consumer("王五", s);
Consumer c2 = pc.new Consumer("老刘", s);
Consumer c3 = pc.new Consumer("老林", s);
service.submit(p);
service.submit(p2);
service.submit(c);
service.submit(c2);
service.submit(c3);

}

/**
* 生产者
*
*/
class Producer implements Runnable {
private String name;

private Storage s = null;

public Producer(String name, Storage s) {
this.name = name;
this.s = s;
}

@Override
public void run() {
try {
while (true) {
Product product = new Product((int) (Math.random() * 10000)); // 产生0~9999随机整数
System.out.println(name + "准备生产(" + product.toString() + ").");
s.push(product);
System.out.println(name + "已生产(" + product.toString() + ").");
System.out.println("===============");
Thread.sleep(500);
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}

/**
* 消费者
*
*/
class Consumer implements Runnable {

private String name;
private Storage s = null;

public Consumer(String name, Storage s) {
this.name = name;
this.s = s;
}

public void run() {
try {
while (true) {
System.out.println(name + "准备消费产品.");
Product product = s.pop();
System.out.println(name + "已消费(" + product.toString() + ").");
System.out.println("===============");
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}

/**
* 仓库,用来存放产品,内部其实就是用一个队列来操作数据
*/
class Storage {
BlockingQueue<Product> queues = new LinkedBlockingQueue<Product>(10);

/**
* 生产
*/
public vo
ab27
id push(Product p) throws InterruptedException {
queues.put(p);
}

/**
* 消费
*/
public Product pop() throws InterruptedException {
return queues.take();
}
}

/**
* 要生产的产品
*/
class Product {
private int id;

public Product(int id) {
this.id = id;
}

public String toString() {
return "产品:" + this.id;
}
}
}


总结:

消息机制在软件中用的非常多,有Kafka、RabbitMQ、RocketMQ等,都有各自使用的地方,以前学习到的,稍后会在博客之中补上,以作记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 消息