利用线程池实现异步编程
2017-04-20 09:21
281 查看
异步编程简单模型
1.首先定义事件源Eventpackage com.demo.designmode.observer.event; /** * <p>事件源</p> * @autho 董杨炀 * @time 2017-4-12 下午4:40:22 */ public class Event { public final String name; public Event(String name) { super(); this.name = name; } }
2.抽象监听器,定义成接口
package com.demo.designmode.observer.listener; import com.demo.designmode.observer.event.Event; /** * <p>监听器</p> * @autho 董杨炀 * @time 2017-4-12 下午4:43:14 */ public interface Listener { /** * <p>获取监听的事件名</p> * @param e * @return * @autho 董杨炀 * @time 2017-4-12 下午4:45:09 */ public String eventKey(); /** * <p>监听到这个事件之后的响应</p> * @param event * @autho 董杨炀 * @time 2017-4-12 下午4:45:19 */ public void onEvent(Event event); }
3.利用线程池实现任务池,单例
package com.demo.designmode.observer.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; /** * <p>利用线程池,实现TaskPool.单例</p> * @autho 董杨炀 * @time 2017-4-12 下午4:52:09 */ public class TaskPool { private static TaskPool tp = null; //jdk自带线程池 private final ExecutorService pool; /** * 私有构造 */ private TaskPool() { //获取本地CPU线程数,+1是为了提高CPU的利用率 this.pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()+1, new ThreadFactory() { int i = 1; public Thread newThread(Runnable r) { return new Thread(r, "pool-" + this.i++); } }); } /** * <p>提供get方法获取TaskPool实例</p> * @return * @autho 董杨炀 * @time 2017-4-12 下午4:53:46 */ public static TaskPool getInstance() { if (tp == null) { synchronized (TaskPool.class) { if (tp == null) { tp = new TaskPool(); } } } return tp; } /** * <p>提交执行任务</p> * @param task * @autho 董杨炀 * @time 2017-4-12 下午4:56:57 */ public void submitTask(Runnable task) { pool.submit(task); } /** * <p>关闭线程池</p> * @autho 董杨炀 * @time 2017-4-12 下午4:57:33 */ public void shutdown() { pool.shutdown(); } }
4.编写监听池.利用map实现
package com.demo.designmode.observer.pool; import java.util.HashMap; import java.util.Map; import com.demo.designmode.observer.event.Event; import com.demo.designmode.observer.listener.Listener; /** * <p>监听池</p> * @autho 董杨炀 * @time 2017-4-12 下午4:46:49 */ public class ListenerPool { //定义监听池 public static final Map<String,Listener> pool = new HashMap<>(); /** * <p>添加监听器到池中</p> * @param linstener * @autho 董杨炀 * @time 2017-4-12 下午4:50:40 */ public static void addListener(Listener linstener) { String eventKey = linstener.eventKey(); pool.put(eventKey, linstener); } /** * <p>根据对应的Event事件获取监听,并将监听到任务交给任务池(线程池)异步执行</p> * @param e * @autho 董杨炀 * @time 2017-4-12 下午5:00:14 */ public static void submitEvent(final Event e) { //根据Event事件获取监听 final Listener listener = pool.get(e.name); if(listener != null){ TaskPool taskpool = TaskPool.getInstance(); taskpool.submitTask(new Runnable() { @Override public void run() { listener.onEvent(e); } }); } } }
5.简单实现Listener进行测试Demo
package com.demo.designmode.observer; import com.demo.designmode.observer.event.Event; import com.demo.designmode.observer.listener.Listener; public class AListener implements Listener { @Override public String eventKey() { return "A"; } @Override public void onEvent(Event event) { System.out.println("线程:"+Thread.currentThread().getName()+"---A事件发生"); } }
package com.demo.designmode.observer; import com.demo.designmode.observer.event.Event; import com.demo.designmode.observer.listener.Listener; public class BListener implements Listener{ @Override public String eventKey() { return "B"; } @Override public void onEvent(Event event) { System.out.println("线程:"+Thread.currentThread().getName()+"---B事件发生"); } }
package com.demo.designmode.observer; import com.demo.designmode.observer.event.Event; import com.demo.designmode.observer.pool.ListenerPool; import com.demo.designmode.observer.pool.TaskPool; /** * <p>异步编程实例演示</p> * @autho 董杨炀 * @time 2017-4-12 下午5:10:13 */ public class EventListenerTest { public static void main(String[] args) { System.out.println("main run"); AListener aLinstener = new AListener(); BListener bLinstener = new BListener(); ListenerPool.addListener(aLinstener); ListenerPool.addListener(bLinstener); Event e = new Event("A"); Event e1 = new Event("B"); ListenerPool.submitEvent(e); ListenerPool.submitEvent(e1); System.out.println("mian end"); TaskPool.getInstance().shutdown(); } }
相关文章推荐
- 按"利用C++语言设计可扩展线程池"文章实现代码,但是有问题,希望大家来讨论,指出问题,谢谢
- 利用线程池实现多客户端和单服务器端Socket通讯(一):同步方式
- java线程池工具类代码(利用java官方线程池类ExecutorService实现)
- 【c++11 新特性应用】利用bind实现通用的混合任务线程池
- 利用libevent 和线程池实现高并发服务器的设计
- 利用异步委托实现异步编程
- 利用libevent 和线程池实现高并发服务器的设计
- 利用Linux系统函数实现线程池(C++)
- Spring Boot利用@Async如何实现异步调用:自定义线程池
- 利用线程池实现多客户端和单服务器端Socket通讯(二):异步编程模型实现
- 利用ACE 自己实现的线程池
- 利用ACE 自己实现的线程池
- 二 Java利用等待/通知机制实现一个线程池
- android利用线程池高效实现异步任务
- java利用线程池实现处理socket请求的小例子
- 利用ace的ACE_Task等类实现线程池
- [Java]利用java.util.concurrent实现多线程的线程池开发
- 利用线程池实现Android客户端的http网络数据请求工具类
- 利用ace的ACE_Task等类实现线程池的方法详解
- java利用线程池(ExecutorService)配合Callable和Future实现执行方法超时的阻断