Java中的IO方式主要分为3种:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。
BIO
同步阻塞模式。在JDK1.4以前,使用Java建立网络连接时,只能采用BIO方式,在服务器端启动一个ServerSocket,然后使用accept等待客户端请求,对于每一个请求,使用一个线程来进行处理用户请求。线程的大部分时间都在等待请求的到来和IO *** 作,利用率很低。而且线程的开销比较大,数量有限,因此服务器同时能处理的连接数也很低。
NIO
BIO模式中,是“一个Socket一个线程”;而在NIO中则是使用单个或少量的线程来轮询Socket,当发现Socket上有请求时,才为请求分配线程。因此是“一个请求一个线程”。
具体实现就是把Socket通过Channel注册到Selector,使用一个线程在Selector中轮询,发现Channel有读写的事件,就可以分配给其他线程来处理(通常使用线程池)。
AIO
从JDK7开始支持AIO模式。通过AsynchronousServerSocketChannel中注册事件回调函数来处理业务逻辑。当IO *** 作完成以后,回调函数会被调用。如果传入AsynchronousChannelGroup,可以绑定线程池来处理事件。
关于JDK的实现,Windows平台基于IOCP实现AIO,Linux只有eppoll模拟实现了AIO。
附:关于IO经常提到Reactor/ Proactor模式。
这两个模式中都有两个角色:事件多路分离器(Event Demultiplexer)和事件处理器(Event Handler)。分离器负责对监听IO事件,并通知处理器;处理器负责对IO内容进行处理,完成对应的业务。
二者的差异,以读 *** 作为例(写 *** 作类似)。
Reactor中实现读:
1. 注册读就绪事件和相应的事件处理器。
2. 事件分离器等待事件。
3. 事件到来,激活分离器,分离器调用对应的处理器。
4. 处理器完成IO读 *** 作,处理读到的数据,注册新的事件,然后返还控制权。
Proactor中实现读:
1. 注册读完成事件和相应的事件处理器(包括缓冲区地址)。
2. 事件分离器等待 *** 作完成事件的同时, *** 作系统利用并行的内核线程执行实际的读 *** 作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读 *** 作完成。
3. 事件分离器呼唤处理器。
4. 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步 *** 作,并将控制权返回事件分离器。
由此可见,两者的主要区别:Reactor中,由用户线程(事件处理器所在线程)完成IO的读写 *** 作;而在Proactor中,是由 *** 作系统完成IO读写 *** 作后,再通知事件处理器,用户线程只完成对数据的业务逻辑处理部分。
更多问题可以问远标教育中心的技术咨询。
一个系统分为不同的模块,你的这个属于数据接收模块,保存到数据库库的属于数据持久化模块,这两个之间相互调用就能够达到你的目的,所以和你数据来源本身无关。数据持久化的模块你可以看看java如何写入mysql数据库,通常是使用jdbc连接数据库,开始事务,然后执行insert into的sql语句,然后提交事务即可。网上例子很多,你可以参考。
127.0.0.1这个IP代表的是你本机!至于“强迫关闭了一个现有的连接”
要么是中毒了要么就是你在下载文件2002年以后微软XPSP2引用了并发连接数限制的功能,默认的只有20个!但是现在除得盗版系统一般都破解提升了连接数好几倍。一般来说不会使这个原因!
再就是你说的问题不明确!其他我无法回答!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)