- 浏览: 111143 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (134)
- java (134)
- [转]sqlserver 数据类型 及使用考虑 (1)
- 保存、读取、删除到sdcard图片 (1)
- hashcode 重写 (1)
- sql2008导出数据 (1)
- Android开发(1):随机绘制彩色实心圆 (1)
- JPA 应用技巧 1:实体类和实体 DAO 模板 (1)
- 狩魂之神即将开测 - 2012年最值得期待的网页游戏 (1)
- mantis (1)
- MediaWiki (1)
- ExtMail (1)
- MDaemon搭建公司项目环境 (1)
- NIO 之 选择就绪模式 (1)
- web应用系统架构设计 (1)
- XML CDATA (1)
- firefox+Firebug调试JavaScript、HTML和CSS (1)
- 在SUSE 11中安装Windows虚拟机 (1)
- 将字节流(byte[])转换成文件 (1)
- HTML5网站 (1)
- 在Android中自定义IOS风格的按钮 (1)
- 基于SVG的WebGIS的一个雏形 (1)
- 程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题 (1)
- 介绍一个ASP.NET开发工具Web Matrix (1)
- C#信息采集工具实现 (1)
- Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布 (1)
- 2011面试题目之猴子偷桃 (1)
- Linux tar压缩时排除某个目录或文件的参数 (1)
- Crack JRebel 4.0,无需重启JVM,热部署解决方案 (1)
- Groovy Sql使用Spring的事务管理 (1)
- <<让oracle跑的更快1>>读书笔记2 (1)
- 不要再浪费时间 (1)
- JSP (1)
- PHP (1)
- Python (1)
- Ruby (1)
- Perl概要及各自特点 (1)
- JVM 内存结构(转) (1)
- [转载]JPA 批注参考(1) (1)
- Hadoop配置部分内容 (1)
- HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合 (1)
最新评论
-
alexyao8:
顶起
[G4Studio开源平台]如何搭建G4开发环境 -
greatghoul:
太二了。
不要再浪费时间 -
wengbo316:
它们一定是花果山的猴子,数数能数到3K多呢。。。
2011面试题目之猴子偷桃 -
mycar:
额.待补充...........
保存、读取、删除到sdcard图片 -
沙舟狼客:
这太折磨人了, 还有人要看吗?
[] javaeye rss抓取
[size=small;]? ? ?[/size][size=small;][size=medium;]Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。[/size][/size]
[size=small;][size=medium;]? ? ? ?Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。[/size][/size]
[size=small;][size=medium;]? ? ? Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。[/size][/size]
?
<p style="text-align: center;">? ? ? ? ? ? ? ? ? ? ?[size=small;]图 1 ? [size=10.5pt;" lang="EN-US]<span><span style="font: 7.0pt ;">? ?[/size][/size]</span><span>类结构图</span></span>
?
?
package cn.chenkangxian.nioconcurrent; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import java.util.LinkedList; import java.util.List; /** * @Project: testNio * * @Author: chenkangxian * * @Annotation: 使用线程池来处理大量channel并发 * * @Date:2011-7-5 * * @Copyright: 2011 chenkangxian, All rights reserved. * */ public class SelectSocketsThreadPool extends SelectSockets { private static final int MAX_THREADS = 5; private ThreadPool pool = new ThreadPool(MAX_THREADS); /** * 从socket中读数据 */ protected void readDataFromSocket(SelectionKey key) throws Exception { WorkerThread worker = pool.getWorker(); if (worker == null) { return; } worker.serviceChannel(key); } /** * * @Project: concurrentnio * * @Author: chenkangxian * * @Annotation:线程池 * * @Date:2011-7-20 * * @Copyright: 2011 chenkangxian, All rights reserved. * */ private class ThreadPool { List idle = new LinkedList(); /** * 线程池初始化 * * @param poolSize 线程池大小 */ ThreadPool(int poolSize) { for (int i = 0; i < poolSize; i++) { WorkerThread thread = new WorkerThread(this); thread.setName("Worker" + (i + 1)); thread.start(); idle.add(thread); } } /** * 获得工作线程 * * Author: chenkangxian * * Last Modification Time: 2011-7-20 * * @return */ WorkerThread getWorker() { WorkerThread worker = null; synchronized (idle) { if (idle.size() > 0) { worker = (WorkerThread) idle.remove(0); } } return (worker); } /** * 送回工作线程 * * Author: chenkangxian * * Last Modification Time: 2011-7-20 * * @param worker */ void returnWorker(WorkerThread worker) { synchronized (idle) { idle.add(worker); } } } private class WorkerThread extends Thread { private ByteBuffer buffer = ByteBuffer.allocate(1024); private ThreadPool pool; private SelectionKey key; WorkerThread(ThreadPool pool) { this.pool = pool; } public synchronized void run() { System.out.println(this.getName() + " is ready"); while (true) { try { this.wait();//等待被notify } catch (InterruptedException e) { e.printStackTrace(); this.interrupt(); } if (key == null) {//直到有key continue; } System.out.println(this.getName() + " has been awakened"); try { drainChannel(key); } catch (Exception e) { System.out.println("Caught '" + e + "' closing channel"); try { key.channel().close(); } catch (IOException ex) { ex.printStackTrace(); } key.selector().wakeup(); } key = null; this.pool.returnWorker(this); } } synchronized void serviceChannel(SelectionKey key) { this.key = key; //消除读的关注 key.interestOps(key.interestOps() & (~SelectionKey.OP_READ)); this.notify(); } void drainChannel(SelectionKey key) throws Exception { SocketChannel channel = (SocketChannel) key.channel(); int count; buffer.clear(); while ((count = channel.read(buffer)) > 0) { buffer.flip(); while (buffer.hasRemaining()) { channel.write(buffer); } buffer.clear(); } if (count < 0) { channel.close(); return; } //重新开始关注读事件 key.interestOps(key.interestOps() | SelectionKey.OP_READ); key.selector().wakeup(); } } public static void main(String[] args) throws Exception { new SelectSocketsThreadPool().go(args); } }
?
?
package cn.chenkangxian.nioconcurrent; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; /** * * @Project: concurrentnio * * @Author: chenkangxian * * @Annotation: * * @Date:2011-7-11 * * @Copyright: 2011 chenkangxian, All rights reserved. * */ public class SelectSockets { public static int PORT_NUMBER = 1234; private ByteBuffer buffer = ByteBuffer.allocate(1024); public static void main(String[] args) throws Exception { new SelectSockets().go(args); } public void go(String[] args) throws Exception{ int port = PORT_NUMBER; // if(args.length > 0){ // port = Integer.parseInt(args[0]); // } // System.out.println("Listening on port " + port); ServerSocketChannel serverChannel = ServerSocketChannel.open(); ServerSocket serverSocket = serverChannel.socket(); Selector selector = Selector.open(); serverSocket.bind(new InetSocketAddress(port)); serverChannel.configureBlocking(false); serverChannel.register(selector, SelectionKey.OP_ACCEPT); while(true){ int n = selector.select(); //没有轮询,单个selector if(n == 0){ continue; } Iterator it = selector.selectedKeys().iterator(); while(it.hasNext()){ SelectionKey key = (SelectionKey)it.next(); if(key.isAcceptable()){ ServerSocketChannel server = (ServerSocketChannel)key.channel(); SocketChannel channel = server.accept(); registerChannel(selector,channel ,SelectionKey.OP_READ); sayHello(channel); } if(key.isReadable()){ readDataFromSocket(key); } it.remove(); } } } /** * 在selector上注册channel,并设置interest * * Author: chenkangxian * * Last Modification Time: 2011-7-11 * * @param selector 选择器 * * @param channel 通道 * * @param ops interest * * @throws Exception */ protected void registerChannel(Selector selector, SelectableChannel channel, int ops) throws Exception{ if(channel == null){ return ; } channel.configureBlocking(false); channel.register(selector, ops); } /** * 处理有可用数据的通道 * * Author: chenkangxian * * Last Modification Time: 2011-7-11 * * @param key 可用通道对应的key * * @throws Exception */ protected void readDataFromSocket(SelectionKey key) throws Exception{ SocketChannel socketChannel = (SocketChannel)key.channel(); int count; buffer.clear(); //Empty buffer while((count = socketChannel.read(buffer)) > 0){ buffer.flip(); while(buffer.hasRemaining()){ socketChannel.write(buffer); } buffer.clear(); } if(count < 0){ socketChannel.close(); } } /** * 打招呼 * * Author: chenkangxian * * Last Modification Time: 2011-7-11 * * @param channel 客户端channel * * @throws Exception */ private void sayHello(SocketChannel channel) throws Exception{ buffer.clear(); buffer.put("Hello 哈罗! \r\n".getBytes()); buffer.flip(); channel.write(buffer); } }
?
?
?
?
?
<ul style="display:none;">
</ul>
发表评论
-
HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合
2012-02-07 15:13 1092今天看着教程刚刷了台HD2,觉得有用的文章顺便转载过来 ... -
Hadoop配置部分内容
2012-02-04 15:29 737[size=medium;]Hadoop配置部分内容[ ... -
[转载]JPA 批注参考(1)
2012-02-04 11:39 722作为 Java 企业版 5 ... -
JVM 内存结构(转)
2012-02-03 14:49 894http://www.4ucode.com/Study ... -
JSP,PHP,Python,Ruby,Perl概要及各自特点
2012-01-31 15:18 989互联网技术日新月异,编程的语言层出不穷,原本稍微平静了 ... -
不要再浪费时间
2012-01-31 15:08 903不要再浪费时间 &l ... -
<<让oracle跑的更快1>>读书笔记2
2012-01-11 13:24 10181 绑定变量 1 ... -
Groovy Sql使用Spring的事务管理
2011-12-28 18:43 1280Grails如果不想用Hibernate的东东,可以直 ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-28 18:28 1169http://dl.dropbox.com/u/229 ... -
Linux tar压缩时排除某个目录或文件的参数
2011-12-21 13:48 1299在对某个目录进行压缩的时候,有时候想排除掉某个目录,例 ... -
2011面试题目之猴子偷桃
2011-12-21 11:14 1499<span style="" ... -
Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
2011-12-20 14:53 1593首先是准备工作 ... -
C#信息采集工具实现
2011-12-20 12:34 908简单C#信息采集工具实现 最近想整只爬虫玩玩,顺便熟 ... -
介绍一个ASP.NET开发工具Web Matrix
2011-12-19 09:49 956想学习或者开发个小型的ASP.NET程序,装个VS.N ... -
程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题
2011-12-19 09:24 909<font style="bac ... -
基于SVG的WebGIS的一个雏形
2011-12-14 13:19 673我和一位师弟,经过了很多天的努力,终于做出了一个简单的 ... -
在Android中自定义IOS风格的按钮
2011-12-12 10:09 1091<p class="MsoNorm ... -
HTML5网站
2011-12-12 08:55 802记得刚来现在公司的时候,老大就说,作为移动平台部门的员 ... -
将字节流(byte[])转换成文件
2011-12-09 08:25 1517/** * 将字节流转换成文件 * @par ... -
在SUSE 11中安装Windows虚拟机
2011-12-09 01:29 892Novell公司最近推出 ...
相关推荐
NIO的核心组件是Selector,它是一个监管多个Channel的多路复用器,能够检测一个或多个Channel是否处于就绪状态,即检查Channel是否有I/O操作可执行。这种模式使得仅需要一个或几个线程就能管理多个Channel,大大降低...
NIO的核心概念包括Channel(通道)、Selector(选择器)和Buffer(缓冲区)。Channel类似于BIO中的流,但更具体,可以类比为实际的交通方式,如汽车或高铁,它提供了读写数据的能力。Selector扮演调度者的角色,能够...
通过分析这个NIO项目源码,你可以学习到如何在实际项目中应用NIO技术,理解其设计模式和优化策略,对于提升Java网络编程的能力大有裨益。深入研究NIO的细节,有助于你在开发高效、高并发的服务时做出明智的选择。
NIO的主要特点是采用面向缓冲区、通道和选择器的模式,而不是传统的字节流方式。这种方式不仅提高了数据处理速度,而且通过非阻塞通信机制,使得单个线程能够管理更多的连接,极大地优化了资源利用效率。 #### Java...
NIO的核心组件包括通道(Channels)、选择器(Selectors)和缓冲区(Buffers)。在Java NIO中,Socket通信可以采用非阻塞模式,允许一个线程处理多个客户端连接,这对于高并发的网络应用尤其有益。 在给定的示例中...
NIO与传统的 Blocking I/O(阻塞I/O)模式相比,最大的区别在于,NIO不会在等待数据时阻塞线程,而是采用回调或轮询的方式,这样可以更好地利用系统资源,提高并发处理能力。 NIO的核心组件包括通道(Channel)、...
Java NIO的核心组件主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors): - **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。Java NIO提供了多种通道,如FileChannel用于文件...
此外,`java.nio.channels.Selector.select()`方法的实现也非常重要,它会阻塞直到至少有一个通道准备就绪,然后返回就绪通道的数量。 对于大数据处理,NIO的一个典型应用场景是高并发的网络服务器,例如基于NIO的...
Reactor模式和NIO是两种在网络编程中广泛使用的并发处理技术。Reactor模式是一种事件驱动的设计模式,主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供...
- **缓冲区(Buffers)**:NIO中的数据操作都在缓冲区上进行,这是NIO的主要特性之一,缓冲区提供了更高效的数据存取方式。 - **选择器(Selectors)**:选择器允许单个线程监视多个通道,当通道准备好进行读写...
3. **Reactor模式**:在NIO中,Reactor模式是一种处理多个客户端连接的并发设计模式。它通过一个线程来监听和接受新的连接,然后分派事件到相应的处理器。相比于传统的多线程模型,Reactor模式可以更有效地管理大量...
- **选择器使用**:通过Selector监听多个通道的就绪状态,实现多路复用,提高程序并发性能。 - **非阻塞I/O**:展示如何使用非阻塞模式避免线程被长时间阻塞,提高系统资源利用率。 这个Demo将帮助你理解如何在实际...
**NIO非阻塞模式**:相比之下,NIO采用了非阻塞模式,即当没有数据可读时,`read()`方法不会阻塞,而是立即返回。这意味着应用程序可以同时处理多个输入/输出操作,而不需要为每个操作分配一个独立的线程。这样的...
而NIO则采用了非阻塞模式,允许程序在等待数据准备就绪的过程中去做其他事情,提高了程序的效率和并发性。 **NIO的核心组件:** 1. **Channel(通道)**:Channel是数据传输的双向管道,可以同时进行读写操作。例如...
4. **多路复用器模式(Multiplexing)**:Java NIO的这种模式使得服务器可以处理成千上万个并发连接,而不必为每个连接创建单独的线程,避免了线程上下文切换的开销,提升了性能。在高并发场景下,如Web服务器、聊天...
选择器通过调用`select()`方法来获取准备就绪的通道,并且可以选择性地处理这些通道。 4. **非阻塞I/O**: 在传统的BIO模型中,如果一个线程正在进行I/O操作时被阻塞,其他线程也无法进行任何操作。而NIO的非阻塞...
Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java IO API在面对大量并发连接时存在的性能瓶颈。 ##### 使用...
NIO的核心概念和机制包括阻塞和非阻塞、同步和异步以及IO模型和选择器 Selector。 首先,阻塞与非阻塞关注的是进程访问数据时,数据是否准备就绪的处理方式。在阻塞模式下,当请求的数据没有准备好时,进程会停下来...
而NIO则是采用非阻塞模式,当数据未准备好时,程序不会等待,而是继续执行其他任务,从而提高了程序的执行效率。 NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。接下来,我们将详细...
NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高的效率。在本篇文章中,我们将深入探讨Java NIO如何读取文件。 一、NIO的基本概念 1. 缓冲区(Buffer):NIO的...