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 ...
 
随机推荐
- asp.net获取URL方法
			
方法如下: Request.Url.ToString()获取完整url(协议名+域名+站点名+文件名+参数):https://localhost:44300/WebForm1.aspx?abc=123 ...
 - 小菜的系统框架界面设计-XiaoCai.WinformUI代码开源
			
我的源码分享 曾经,看到别人漂亮的系统界面,合理的布局,可是却没有提供源码,道理很简单,就是有偿提供,实际上对于有些技巧的东西也并没有多么难,只是不懂原理,感觉到困难罢了. 而对于刚毕业的我,求知欲强 ...
 - 一个完整的Core Data应用
			
在这篇文章中,我们将建立一个小型但却全面支持Core Data的应用.应用允许你创建嵌套的列表:每个列表的item都可以有子列表,这将允许你创建非常深层次的item.为了让大家完整的了解发生了什么,我 ...
 - Linux下搭建PHP开发环境(LAMP)
			
LAMP:Linux+Apache+Mysql/MariaDB+Perl/PHP/Python 一键安装方法如下: 注:Ubuntu下可使用sudo su 命名切换到root用户. 开始安装之前,先执 ...
 - EasyMvc入门教程-基本控件说明(7)文字块导航
			
文字块导航其实就是开发winform时候常见的 带Title的Group面板..~!@#¥..好吧,没开发过winform的同学看下图: 实现代码如下: @Html.Q().BlockField(). ...
 - MR之SequenceFile具体解释
			
package com.leaf.hadoop.second; import java.util.Random; import org.apache.hadoop.conf.Configuration ...
 - 使用Jsoup解决网页中图片链接问题
			
在做Facebook和WhatsApp分享的时候,分享出去的谷歌短链,Facebook获取不到大图,和竞品展示的不一样,WhatsApp分享出去的短链没有图片和描述. WhatsApp: 分析竞品UC ...
 - python tkinter GUI绘制,以及点击更新显示图片
			
tkinter 绘制GUI简单明了,制作一些简单的GUI足够,目前遇到的一个问题是不能同时排列显示多幅图片(目前没找到同时显示解决方法), 退而求其次,改成增加一个update按钮,每次点下按钮自动更 ...
 - js 选项卡封装
			
function tab(input,div){ for(var i = 0; i < input.length; i++){ input[i].index = i; input[i].oncl ...
 - 移动端去掉按钮button默认样式
			
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...