`

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

 
阅读更多

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



 

 

  • 大小: 97.5 KB
  • 大小: 59.3 KB
分享到:
评论

相关推荐

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java nio and reactor

    java nio 作者的ppt。 How to Build a Scalable Multiplexed Server With NIO 文中讲述如何使用java nio来实现高性能的服务器。...2、java nio 和 reactor 的映射关系 3、如果使用java nio 来实现高性能服务器

    大数据学习之旅——NIO源码

    本篇文章将带你深入理解NIO的源码,揭示其在大数据环境下的应用与优势。 NIO与传统的IO模型(-blocking I/O)相比,主要的区别在于它允许单线程处理多个通道(channels),而无需为每个通道创建一个单独的线程。...

    Java NIO——Java NIO

    Java NIO——Java NIO——Java NIO

    Java IO, NIO and NIO.2

    本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是Java语言中传统的输入输出处理方式。它基于流的概念,包括字节流和字符流...

    Reactor模式和NIO

    Reactor模式是一种事件驱动的设计模式,主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供的一种I/O模型,它支持基于事件的多路复用,为实现Reactor模式...

    java io 与java nio区别

    在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是Java早期版本中的主要I/O处理方式。...

    IO和NIO区别

    NIO 相比标准 IO,有更多的优势,特别是在高并发连接的情况下。在 NIO 中,单线程可以管理多个通道,而标准 IO 则需要多个线程来管理多个连接。这样,NIO 可以更好地处理高并发连接,减少资源占用和提高性能。 5. ...

    socket-nio-single-reactor.zip

    Socket NIO 单 Reactor 模式是一种在 Java 中实现高性能网络编程的技术,它结合了非阻塞I/O(New I/O,即NIO)和Reactor设计模式。本示例代码旨在帮助开发者理解如何使用Java NIO和Reactor模式构建网络服务。尽管...

    Java IO NIO and NIO 2 epub

    Java IO NIO and NIO 2 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Java IO_NIO

    总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。

    Java IO与NIO:深入理解与实践指南

    Java IO和NIO提供了两种不同的I/O处理方式,各有优势和适用场景。IO适用于简单的I/O操作,而NIO则适合于需要高性能和高并发的应用。了解这两种I/O处理方式的区别和特点,可以帮助开发者根据具体的应用需求选择合适的...

    IO、文件、NIO 最佳阅读资料与实践

    在IT领域,输入/输出(IO)和文件操作是编程中的基础部分,而NIO(New Input/Output)则是Java平台提供的一种高级IO机制,它为开发者提供了更强大的数据传输能力。这篇博客“IO、文件、NIO最佳阅读资料与实践”可能...

    io+nio拷贝及nio按行读取

    使用 io和nio 各个方式进行文件拷贝; 使用nio+byteBuffer 实现按行读取文件(大文件),在window/linux/macOS上均测试通过,对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    ScalableIOJava(NIO如何实现Selector模式的).pdf

    标题《Scalable IO in Java》和描述表明本文档讨论...通过理解Reactor模式以及如何在Java中通过NIO API实现这一模式,开发者可以构建出能够处理大量并发连接的应用程序,并达到高可伸缩性、高可用性以及高性能的目标。

    Java IO,NIO and NIO.2 mobi

    java io nio nio2 java io的百科全书 mobi格式 需要kindle 软件

Global site tag (gtag.js) - Google Analytics