深入了解LINUX下IO模式(一)——NIO及reactor模式

5 篇文章 0 订阅
2 篇文章 0 订阅

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模式:



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值