您的位置:首页 > 编程语言

利用线程池实现异步编程

2017-04-20 09:21 281 查看

异步编程简单模型

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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: