NIO中采用了当前比较热的reactor模式,废话不多说,上一个reactor的demo
Selector:
public class Selector
{
private BlockingQueue<Event> queue = new LinkedBlockingQueue<>();
private Object lock = new Object();
public List<Event> select() {
return select(0);
}
List<Event> select(long timeout) {
if (timeout > 0 ) {
if (queue.isEmpty()) {
synchronized (lock)
{
if (queue.isEmpty()) {
try {
lock.wait(timeout);
} catch (InterruptedException e) {
}
}
}
}
}
List<Event> list = new ArrayList<>();
queue.drainTo(list);
return list;
}
public void addEvent(Event event) {
boolean success = queue.offer(event);
if (success) {
synchronized (lock)
{
lock.notify();
}
}
}
}
Dispatcher:
public class Dispatcher
{
private Map<EventType,EventHandler> eventHandlerMap = new HashMap<>();
Selector selector;
public Dispatcher(Selector selector)
{
super();
this.selector = selector;
}
public void regisiterHandler(EventType eventType,EventHandler handler) {
eventHandlerMap.put(eventType, handler);
}
public void removeHandler(EventType eventType) {
eventHandlerMap.remove(eventType);
}
public void handle() {
dispatch();
}
private void dispatch() {
while (true) {
List<Event> events = selector.select();
for (Event event: events) {
EventHandler eventHandler = eventHandlerMap.get(event.type);
eventHandler.handle(event);
}
}
}
}
Event:
public class Event
{
public EventType type;
public Event(EventType type)
{
super();
this.type = type;
}
}
EventType:
public enum EventType
{
READ,WRITE,ACCEPT,QUIT
}
EventHandler:
public interface EventHandler
{
void handle(Event event);
}
public class ReadEventHandler implements EventHandler
{
@Override
public void handle(Event event)
{
System.out.println("Read event handler");
}
}
public class WriteEventHandler implements EventHandler
{
@Override
public void handle(Event event)
{
System.out.println("write event handler");
}
}
Main:
public static void main(String[] args)
{
final Selector selector = new Selector();
Dispatcher dispatcher = new Dispatcher(selector);
dispatcher.regisiterHandler(EventType.READ, new ReadEventHandler());
dispatcher.regisiterHandler(EventType.WRITE, new WriteEventHandler());
for (int i = 0; i<10;i++) {
final int j = i;
Thread t = new Thread(new Runnable() {
@Override
public void run()
{
if (j%2==0) {
selector.addEvent(new Event(EventType.READ));
} else {
selector.addEvent(new Event(EventType.WRITE));
}
}
});
t.start();
}
dispatcher.handle();
}
简单说明下,reactor必须有一个selector和dispatcher,
selector用于收集事件,dispacher用于将事件分派到不同的handler里去处理,
eventhandler由于具体业务处理的抽象
基于reactor的NIO及redis的单线程模式可见这样的一种编程模式效率并不会比纯异步的低。
普通异步处理:
reactor模式: