假如如今有一个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,推荐的地址例如以下:

http://ifeve.com/disruptor/

Java异步编程第2篇的更多相关文章

  1. java异步编程降低延迟

    目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...

  2. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1

    Paip.Php  Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1       异步调用的实现以及角色(:调用者 提货单) F ...

  3. 【Todo】【读书笔记】Java多线程编程指南-设计模式篇

    下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.

  4. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  5. Java 异步编程的几种方式

    前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...

  6. Java异步编程——深入源码分析FutureTask

    Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...

  7. Java 异步编程

    昨天头儿给的学习文档我还没看完,头儿说:“MongoDB光会简单的添删改查什么的不行,要深入了解,你们连$set和$inc使用场景都分不清.” 确实,学习过一年多SQL,确实对学习MongoDB有点影 ...

  8. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  9. java并发编程JUC第九篇:CountDownLatch线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

随机推荐

  1. Codeforces 597C 子序列

    题面 [题目描述] 给你一个包含n个不同元素的序列,让你求出在这个序列中有多少个长度为k+1的上升子序列.保证答案不会超过8*10^18. [输入描述] 第一行包括两个正整数n和k(1<=n&l ...

  2. 11i REP-3000: 启动 Oracle Toolkit 时发生内部错误.

    +---------------------------------------------------------------------------+ 应用对象程序库: Version : 11. ...

  3. 真正解决 thinkphp 验证码 出错 无法显示 问题

    今天做到验证码这一块想到tp自带验证图片  大喜单鼓捣半天不出来 一直是个小 X 官方提示:如果无法显示验证码,请检查:² PHP是否已经安装GD库支持:²输出之前是否有任何的输出(尤其是UTF8的B ...

  4. CentOS7.0修改主机名(hostname)

    Linux中的hostname在大多数应用中至为重要,例如有些应用强制使用主机名称而不能使用IP地址,如果默认主机名称都为localhost.localdomain 的话那一定会出现问题,而且看起来也 ...

  5. mysql下监测数据库语句creating sort index时间过长的问题

    在一张单表5000W数据上进行数据查询时传入两个单列索引条件,进行组合索引查询时,如果最后有order by id排序,与去除该排序,性能差距接近两个数量级 结论:在使用列的默认排序时,不应该再ord ...

  6. mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析

    1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...

  7. Shell脚本之:变量

    与编译型语言不同,shell脚本是一种解释型语言. 执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code), ...

  8. 网站添加ico图标

    打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法一(被动式): 制作一个ico格式 ...

  9. 【Excle数据透视表】如何重命名数据透视表

    如下图,是新生成的一个数据透视简表,现在需要将其数据透视表的名称修改为:汇总数据 解决办法 修改后的效果如下:

  10. C# MVC VS WebAPI

    获取路径: MVC:Server.MapPath("/Templates/vshop/default.json") WebAPI:System.Web.Hosting.Hostin ...