开源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