NIO总结(三)

开源NIO结构的服务器框架:MINA(仍然持续更新) ,NETTY(另一种设计)
实现客户端服务器端双向通信,双向的发消息,客户端和服务器端都有可能主动发消息
样例代码:NIOClientDemo2 NIOServerDemo2
此时应该做处理:注册完之后,关注connect,read,write两边都需要同时关注这三点
同时注册connect,read,write,accept等实践时候用的与或非的原理即可同时注册    
interestOps() 获取此键的 interest 集合。
interestOps(int ops)  将此键的 interest 集合设置为给定值                
NIO和BIO对比,只开启一个线程处理多个事件,性能比BIO提高很多,但是代码比BIO写代码复杂太多            
NIO只是对BIO的一个补充,它主要用于高并发场景。(当每个请求真的非常占资源时候不适合用NIO                
AIO:                
阻塞/非阻塞:从线程角度考虑,考虑线程是不是被挂起状态。在执行某一操作时是否会引起线程的挂起。
同步/异步:从逻辑执行角度考虑,考虑程序是处理一段逻辑时可否并行处理另一个逻辑。        
BIO:同步阻塞式IO(同步:一段时间只能干一件事)--jdk1.0,BlockingIO        
NIO:同步非阻塞(同步:一段时间只能干一件事)--jdk1.4,NonBlockingIO
AIO:异步非阻塞IO(异步:同时处理多件事)--jdk1.7,回调函数方式:未来的趋势,比BIO代码简单
Asnchronous        
DatagramChannel:实现UDP通信。---UDP通信快但不可靠,有可能丢数据,TCP可靠但是通信较慢
DatagramChannelDemo1.java
FileChannel:用于读取写入,映射和操作文件的通道,对文件操作提供一些特殊功能    
RandomAccessFile(String name, String mode) 文件随机读写类                
name一般指定文件名和路径,mode指定是什么模式,mode写rw,只读写模式,r:read,w:write

Java并发工具包:java.util.concurrent(一个线程持续放,一个线程持续取)                
Java5中添加的,使并发编程变的更加简单轻松,里面有各种各样并发编程工具。
1.阻塞队列:BlockingQueue(队列:先进先出,是一种数据结构,栈:先进后出)        
BlockingQueue接口表示一个线程安放和提取实例的队列。通常用于一个线程生产对象,另外一个线程消费这些对象的场景。当消费快,生产快时候,会产生阻塞,当在生产出时候,才消除阻塞。当生产快,消费慢时候,当生产塞满时,产生阻塞,当消费完一个有空挡的时候,解除阻塞。
BlockQueue的方法:提供四组API。            
用add和remove时,不会等待,速度不一致就抛异常,put和take发生阻塞等速度一致再执行
       抛出异常    持续值     阻塞      超时                            
插入  add(e)       offer(e)   put(e)   offer(e, time, unit)                            
移除   remove()   poll()      take()   poll(time, unit)                            
检查   element     peek()     不可用    不可用

                            
☆ArrayBlockingQueue:底层是数组,必须指定大小。初始化时设定上限,之后无法修改该上限。
是一个有界的阻塞式队列,它不能够无限多数量元素。因为数组有上限。
☆LinkedBlockingQueue:底层是基于链表实现,和ArrayBlockingQueue基本一致。
内部链表式结构,对其元素进行存储,如果需要的话,这一链表结构可以选择一个上限,如果没有上限,将使用Integer.MAX_VALUE作为上限。可以设置大小也可以不设置大小DelyQueue:延时队列,为每一个元素可设置超时的时间,如果超时,先存放标志为无效,再获取数据时候无效数据被干掉。    
PriorityBlockingQueue:具有优先级的队列,所有插入该队列的元素必须实现                
java.lang.Comparable接口(比较大小的接口),因此该队列排序取决于Comparable排序。
SynchronousQueue:特殊队列,它的内容只能同时有一个元素。它更像一个汇合点。
BlockingDeque:阻塞双端队列,两边都可以插入数据,两边都可以取数据。                
!!@!!!!
ConcurrentMap:并发Map,表示一个能够对别人的访问(插入和提取)        
进行并发处理的java.util.Map,实现类为ConcurrentHashMap。        
ConcurrentHashMap(线程安全)和java.util.HashTable类很相似,但是ConcurrentHashMap能够
提供比HashTable更好的并发性能,在你从中读取对象审核ConcurrentHashMap并不会把整个
Map锁住,它只是把Map中正在被写入的部分进行锁定。(用起来跟hashMap一样)
hashMap:线程不安全,速度比ConcurrentHashMap和hashtable都快。        
hashtable:线程安全(基本弃之不用)

并发导航映射:ConcurrentNavigableMap<k,v>             *                    
ConcurrentNavigableMap,可以直接new,并发场景下。                    
支持并发访问。                    
headMap()取头部分                    
ConcurrentNavigableMap map = new ConcurrentSkipListMap();                    
map.put("1","one");                    
map.put("2","two");                    
map.put("3","three");                    
ConcurrentNavigableMap headMap = map.headMap("2");                    
headMap将指向一个只含有键“1”的ConcurrentNavigableMap,因为只有这一个键小于“2”。                
从一个大的Map,获取小部分数据。                    
tailMap():取后部分                    
ConcurrentNavigableMap map = new ConcurrentSkipListMap();                    
map.put("1","one");                    
map.put("2","two");                    
map.put("3","three");    
ConcurrentNavigableMap tailMap = map.tailMap("2");                    
tailMap将拥有键“2”和“3”,因为它们不小于给定键“2”。                    
subMap()取中间部分
以上三个map是导航Map

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值