利用线程池实现异步编程

来源:互联网 发布:淘宝怎么换绑支付宝 编辑:程序博客网 时间: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
原创粉丝点击