| 您的当前位置:首页 --> CentOS入门 |
| 编程”灵魂之心“之消息机制 |
| 浏览次数:2405 关键词 ( 之心 灵魂 机制 消息 ) |
|
导读
人之间有语言的交流还有一系列的信号传达信息,那么机器之间也有他们的语言,然而系统之间的工作也是靠互相通信才能完美的工作,那么就让我们看看其中的一种机制——消息机制。
从一个剧情开始
路遥的《平凡的世界》因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的:
这一活生生的例子虽然看着有些悲凉(排队打饭的情景相信曾经是学生的你一定经历过,可能没这般悲凉而已),却像极了消息机制的原理,也许发明消息机制的灵感就是原来于这样的生活吧!排队的学生就是消息队列,值日生分发饭菜就消息循环并完成消息处理,学生吃饭就类似于事件处理。 什么是消息?
何为消息?消息就是带有某种信息的信号,如你用鼠标点击一个窗口会产生鼠标的消息,键盘输入字符会产生键盘的消息,一个窗口大小的改变也会产生消息。
图 1 :消息机制原理
消息队列就是存放消息的一种队列,具有先进先出的特点。每产生一个消息都会添加进消息队列中,在Window中消息队列是在操作系统中定义的。消息队列就如同一群排队打饭的少男少女,这群人中光景较好的排在前面,光景较差的排在后面,可以理解成是一种优先级队列!要想更多的了解队列的相关知识,可参见队列。 在这里我们以控制台输入信息模拟窗口、对话框接收鼠标、键盘等消息,以ArrayBlockingQueue对象存放消息队列。在控制台中输入一个数值和一个字符串代表一个消息,输入-1结束输入。模拟代码如下: package message; import java.util.Queue;import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; /** * 消息 * @author luoweifu */ class Message { //消息类型 public static final int KEY_MSG = 1; public static final int MOUSE_MSG = 2; public static final int SYS_MSG = 3; private Object source; //来源 private int type; //类型 private String info; //信息 public Message(Object source, int type, String info) { super(); this.source = source; this.type = type; this.info = info; } public Object getSource() { return source; } public void setSource(Object source) { this.source = source; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public static int getKeyMsg() { return KEY_MSG; } public static int getMouseMsg() { return MOUSE_MSG; } public static int getSysMsg() { return SYS_MSG; } } interface MessageProcess { public void doMessage(Message msg); } /** * 窗口模拟类 */ class WindowSimulator implements MessageProcess{ private ArrayBlockingQueue msgQueue; public WindowSimulator(ArrayBlockingQueue msgQueue) { this.msgQueue = msgQueue; } public void GenerateMsg() { while(true) { Scanner scanner = new Scanner(System.in); int msgType = scanner.nextInt(); if(msgType < 0) { //输入负数结束循环 break; } String msgInfo = scanner.next(); Message msg = new Message(this, msgType, msgInfo); try { msgQueue.put(msg); //新消息加入到队尾 } catch (InterruptedException e) { e.printStackTrace(); } } } @Override /** * 消息处理 */ public void doMessage(Message msg) { switch(msg.getType()) { case Message.KEY_MSG: onKeyDown(msg); break; case Message.MOUSE_MSG: onMouseDown(msg); break; default: onSysEvent(msg); } } //键盘事件 public static void onKeyDown(Message msg) { System.out.println("键盘事件:"); System.out.println("type:" + msg.getType()); System.out.println("info:" + msg.getInfo()); } //鼠标事件 public static void onMouseDown(Message msg) { System.out.println("鼠标事件:"); System.out.println("type:" + msg.getType()); System.out.println("info:" + msg.getInfo()); } //操作系统产生的消息 public static void onSysEvent(Message msg) { System.out.println("系统事件:"); System.out.println("type:" + msg.getType()); System.out.println("info:" + msg.getInfo()); } } /** * 消息模拟 * @author luoweifu */ public class MessageSimulator { //消息队列 private static ArrayBlockingQueue messageQueue = new ArrayBlockingQueue(100); public static void main(String[] args) { WindowSimulator generator = new WindowSimulator(messageQueue); //产生消息 generator.GenerateMsg(); //消息循环 Message msg = null; while((msg = messageQueue.poll()) != null) { ((MessageProcess) msg.getSource()).doMessage(msg); } } } 这里模拟用例中只有一个消息输入源,且是一种线程阻塞的,只有输入结束后才会进行消息的处理。真实的Windows操作系统中的消息机制会有多个消息输入源,且消息输入的同时也能进行消息的处理。
|
| 下载次数:9 |
| 下载地址:点击下载 |
| 本资源为程序自动采集,如有侵权请联系我们移除 admin#80vps.com 来信请将#替换为@ |
| 下一条 centos系统中网络配置相关 上一条 OpenSSH 曝远程代码执行漏洞,尽快升级 |