Java异步编程第2篇
假如如今有一个Buttonbutton,Buttonbutton上有click和doubleclick事件。
两个不同的事件须要进行不同的处理。这时候就须要为对应的事件注冊Listener了。改动后的文件夹组织结构例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF6aGltYXpo/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
1、事件基本类的编写例如以下:
package com.event.test02;
public class Event {
public String action; // 事件名称
public String message; // 附加说明
/**
* @param action
* @param message
*/
public Event(String action, String message) {
this.action = action;
this.message = message;
}
}
package com.event.test02;
public class EventNames {
/**
* 单击事件
*/
public static final String Click = "Click";
/**
* 双击事件
*/
public static final String DoubleClick = "DoubleClick";
}
package com.event.test02;
import com.event.test02.exception.EventAlreadyRegisteredException;
import com.event.test02.handler.ClickHandler;
import com.event.test02.handler.DoubleClickHandler;
public class EventBinder {
public static void bindEvents(){
try {
EventDispatcher eventDispatcher = EventDispatcher.getInstance();
eventDispatcher.addEventListener(EventNames.Click, new ClickHandler());
eventDispatcher.addEventListener(EventNames.DoubleClick, new DoubleClickHandler());
} catch (EventAlreadyRegisteredException e) {
e.printStackTrace();
}
}
}
package com.event.test02;
import java.util.HashMap;
import com.event.test02.exception.EventAlreadyRegisteredException;
import com.event.test02.exception.UnknowEventException;
import com.event.test02.handler.EventListener;
public class EventDispatcher {
private static EventDispatcher eventDispatcher;
private EventDispatcher(){}
/**
* 获取实例
* @return EventDispatcher
*/
public static EventDispatcher getInstance(){
if(eventDispatcher == null){
eventDispatcher = new EventDispatcher();
}
return eventDispatcher;
}
HashMap<String, EventListener> map = new HashMap<String, EventListener>();
/**
* 加入监听器
* @param event
* @param listener
* @throws EventAlreadyRegisteredException
*/
public void addEventListener(String event, EventListener listener)
throws EventAlreadyRegisteredException {
if(map.get(event) != null){
throw new EventAlreadyRegisteredException();
}
map.put(event, listener);
}
/**
* 移除某一个监听器
* @param event
*/
public void removeEventListener(String event) {
map.remove(event);
}
/**
* @param e
* @throws UnknowEventException
*/
public void dispatchEvent(Event e) throws UnknowEventException {
EventListener listener = map.get(e.action);
if(listener == null){
throw new UnknowEventException();
}else{
listener.handleEvent(e);
}
}
/**
* 移除全部监听器
*/
public void removeAllListeners() {
map.clear();
}
}
2、监听器类的编写例如以下
package com.event.test02.handler;
import com.event.test02.Event;
public interface EventListener {
public void handleEvent(Event e);
}
package com.event.test02.handler;
import com.event.test02.Event;
public class DoubleClickHandler implements EventListener{
public void handleEvent(Event e) {
System.out.println("hand doubleclick event ....");
}
}
package com.event.test02.handler;
import com.event.test02.Event;
public class ClickHandler implements EventListener{
public void handleEvent(Event e) {
System.out.println("hand click event ....");
}
}
3、自己定义异常处理类
package com.event.test02.exception;
public class EventAlreadyRegisteredException extends Exception {
private static final long serialVersionUID = 741821449383395827L;
}
package com.event.test02.exception;
public class UnknowEventException extends Exception {
private static final long serialVersionUID = 4829929946904208467L;
}
最后执行的结果例如以下:
hand click event ....
hand doubleclick event ....
如上的程序灵活了不少,其组织也很清晰。
在使用的时候不要拘泥于某一种形式。
在实际项目开发的过程中,能够将很多大的操作封装为一个专门的任务Task,也能够启动若干个承担不同任务的线程。仅仅要给这些任务定义一个事件名称,当须要执行某个任务时,利用事件触发就可以。
有兴趣的读者能够去看一个框架disruptor,推荐的地址例如以下:
Java异步编程第2篇的更多相关文章
- java异步编程降低延迟
目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- 【Todo】【读书笔记】Java多线程编程指南-设计模式篇
下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.
- Java 异步编程 (5 种异步实现方式详解)
同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...
- Java 异步编程的几种方式
前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...
- Java异步编程——深入源码分析FutureTask
Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...
- Java 异步编程
昨天头儿给的学习文档我还没看完,头儿说:“MongoDB光会简单的添删改查什么的不行,要深入了解,你们连$set和$inc使用场景都分不清.” 确实,学习过一年多SQL,确实对学习MongoDB有点影 ...
- java并发编程系列原理篇--JDK中的通信工具类Semaphore
前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
随机推荐
- div+css经典三行两列布局
写在前面 在面试的时候遇到这样一个笔试题,使用div+css布局一个三行两列的页面.这里主要考察的是css中postion的具体用法.详细信息可参考我这篇文章: [HTML/CSS]说说positio ...
- IOS7开发~API变化
1.弃用 MKOverlayView 及其子类,使用类 MKOverlayRenderer: 2.弃用 Audio Toolbox framework 中的 AudioSession API,使用AV ...
- 【div+css】两个div,如何让内层的div在外层div中水平垂直居中
好久没有写样式,很是很生疏 ==================================================================== 方法1: .parent { wi ...
- mysql----乐观锁总结和实践
悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这 ...
- 200多种Android动画效果的强悍框架
admin 发布于2015-10-23 14:33 363/68015 [精品推荐]200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^ 功能模块和技术方案 只 ...
- linux调整缓存写入磁盘的时间,减少磁盘爆掉的可能性
缓存数据存入磁盘的最长时间,如果这段时间写不完,就会报异常停止写,这样缓存数据会不断积累,导致内存爆掉. echo 0 > /proc/sys/kernel/hung_task_timeout_ ...
- Asp.net对文件夹和文件的操作类
using System; using System.IO; using System.Web; namespace SEC { /**//// /// 对文件和文件夹的操作类 /// public ...
- Python scapy 实现一个简易 arp 攻击脚本
原文链接:http://www.jianshu.com/p/df5918069612 scapy 是 python 写的一个功能强大的交互式数据包处理程序,可用来发送.嗅探.解析和伪造网络数据包,常常 ...
- MAC - 命令行中用sublime打开指定文件,使用ln命令建立软链接
眼下sublime是mac下最好的文本编辑软件.常常要使用它打开一些文件,比如html,js,txt,json等文件,可是sublime2默认不支持在命令行下调用.经过研究发现能够用建立软连接的方式调 ...
- nfs部署和优化 -2
客户端: cat /etc/passwd 显示用户 weifeng 500 服务端: vim /etc/exports /mnt 192.168.1.105(rw,sync,all_squash, ...