java的nio的使用示例分享
在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。
传统的io技术为阻塞的`,比如读一个文件,惹read方法是阻塞的,直到有数据读入。
归纳为:
1、java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了。
2、在1的基础上改进为,开设线程,pt()后让线程去等待,但是当并发量高的时候,相当耗费资源的。
3、java nio为非阻塞,采用的是reactor反应堆模式,或者说observer观察者模式,监察io端口,注册事件到selector,当事件满足条件后触发行为。
大致流程为:
java nio提供一个selector,这个类似一个观察者,将需要探知的socketchannel注册到selector上
接着我们做别的事情,当有事件发生时候,selector会通知我们,传回一组selectionKey,我们读取这些key就会获得到我们刚刚注册过的socketchannel,然后从这个channel读取数据、处理业务逻辑。
selector内部原理,采用轮询的方式,对所注册的channel进行遍历,判断channel所注册的事件是否发生。
代码举例为:
复制代码 代码如下:
// 1.创建一个selector对象
Selector selector = ();
// 2.建立channel对象,并绑定在8080端口上
ServerSocketChannel ssc = ();
InetSocketAddress address = new InetSocketAddress(ocalHost(),8080);
et()(address);
// 3.将channel设定为非阻塞方式
igureBlocking(false);
// 向selector注册channel以及我们感兴趣的事件
SelectionKey skey = ster(selector,_ACCEPT);// 这边注册了accept,服务器接受到client连接事件
// 4、简单模拟下轮询过程
while(true)
{
// selector通过select方法,通知我们感兴趣的事件发生了
int nKeys = ct();
// 当nKeys>0表示事件发生了
// 这时候可以通过ctedKeys();方法拿到key集合
Set selectKeys = ctedKeys();
// 5、迭代遍历keys对象,分别做适配业务逻辑处理
// 比如:
s = (SelectionKey)(ator())();
if(ceptable())// 判断为注册的OP_ACCEPT事件
{
// 从channel中获取我们刚才注册的channel
Socket socket = ((ServerSocketChannel)nel())pt()et();
SocketChannel sc = hannel();
// 设置为非阻塞
igureBlocking(false);
// 注册read/write事件
ster(selector, _READ |_WRITE);
}
}
// 上边就是简单的java nio演示的伪代码
// 这时候,client端可以telnet 主机名 端口号 连接到server服务器。
-
Java中嵌入式MySQL的使用方法介绍
这篇文件主要介绍在Java中嵌入式MySQL的使用,对于一些的应用项目,提供安装版的Mysql,Oracle是必须的工作。但是有时候如果是一个小的工具,可安装或者移植性比较强的小软件。再去安装数据库可能就比较麻烦了。其实MySQL也有嵌入式的,不需要安装,在使用的过程中,会自动...
-
java的nio的使用示例分享
在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的`,比如读一个文件,惹read方法是阻塞的,直到有数据读入。归纳为:1、javaio为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了。2、在1...
-
2017计算机二级考试Java练习题及答案
以下是应届毕业生考试网小编整理的2017年计算机二级考试Java练习题及答案,供考生参考。更多计算机等级考试相关信息请关注应届毕业生计算机等级考试网。1[单选题]下列方法被调用后,一定使调用线程改变当前状态的是()。fy()d()p()ive()参考答案:C参考解析:线程调用s...
-
springmvc如何设置多视图器呢
导语:springmvc如何设置多视图器呢?下面是小编给大家整体的代码,大家可以参考练习,更多详情请关注应届毕业生考试网。在做页面静态化处理时,有时候我们需要两种或者两种以上的视图解析方式,比如jsp,html,json,jstl,ftl等等,显然默认的springmvc只配置一种视图解析方...