利用线程池实现异步编程
来源:互联网 发布:淘宝怎么换绑支付宝 编辑:程序博客网 时间:2024/06/04 23:25
异步编程简单模型
1.首先定义事件源Event
package 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(); }}
0 0
- 利用线程池实现异步编程
- android利用线程池高效实现异步任务
- android利用线程池高效实现异步任务
- 利用ZoomPipeline迅速实现基于线程池的全异步TCP点对点代理
- c#多线程:线程池和异步编程
- c#多线程:线程池和异步编程
- c#多线程:线程池和异步编程
- JAVA并行异步编程线程池+FutureTask
- JAVA并行异步编程线程池+FutureTask
- JAVA并行异步编程线程池+FutureTask
- UDP通信编程------利用CAsyncSock类实现UDP异步通信
- windows 2000XP API 中C++线程池编程实现异步数据插库
- C#异步编程的实现方式(3)——ThreadPool线程池
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- Android开发之图片处理专题(三):利用ThreadPoolExcutor线程池实现多图片的异步加载
- Thread利用线程池封装异步任务【基础版】
- .NET多线程编程(4):线程池和异步编程
- .NET多线程编程(4):线程池和异步编程
- 了解React-Native
- linux甚础
- andorid中页面跳转
- Zookeeper 安装和配置
- MySQL 主从复制搭建,基于日志(binlog)
- 利用线程池实现异步编程
- WP 4 i春秋_2017年春秋欢乐赛
- Java解决TopK问题(使用集合和直接实现)
- 图像数字字符定位
- SVN资料库转移-----dump和load
- JSP_2th_JSP基本语法
- 在Spring Boot中整合Spring Security并自定义验证代码
- 游戏卡片
- HTML5 input file类型,accept(文件类型控制)