java7 AIO初体验
生活随笔
收集整理的這篇文章主要介紹了
java7 AIO初体验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于AIO的概念理解?
關于AIO的概念,僅談談個人的一點理解。可能不到位,請大家指出。
Io的兩個重要步驟:發起IO請求,和實際的IO操作。在unix網絡編程的定義里異步和非異步概念的區別就是實際的IO操作是否阻塞。如果不是就是異步,如果是就是同步。
而阻塞和非阻塞的區別在于發起IO請求的時候是否會阻塞,如果會就是阻塞,不會就是非阻塞。
本人理解能力有限,想了個例子來輔助自己理解:
小明想要買一本<深入java虛擬機>的書,以下幾個場景可以來理解這幾種io模式:
1.??? 如果小明每天都去書店問售貨員說有沒有這本書,如果沒有就回去繼續等待,等下次再過來文。(阻塞)
2.??? 如果小明告訴售貨員想買一本<深入java虛擬機>的書,那么就在家里等著做其他事情去了,如果書到了售貨員就通知小明,小明再自己過去取。
3.??? 如果小明告售貨員想買一本<深入java虛擬機>的書,然后告訴售貨員到了幫他送到某某地方去,就做其他事情去了。小明就不管了,等書到了,售貨員就幫他送到那個地方了。
售貨員可以認為是操作系統的一個服務,而小明是一個用戶進程。不知道是否有誤,如果有誤請大家拍磚指出,謝謝。
可以看出2,3的效率明顯要比1高。但是1最簡單,而2,3需要一些協作。充分證明了團隊合作的力量。
JDK7 AIO初體驗?
AsynchronousChannel:支持異步通道,包括服務端AsynchronousServerSocketChannel和普通AsynchronousSocketChannel等實現。
CompletionHandler:用戶處理器。定義了一個用戶處理就緒事件的接口,由用戶自己實現,異步io的數據就緒后回調該處理器消費或處理數據。
AsynchronousChannelGroup:一個用于資源共享的異步通道集合。處理IO事件和分配給CompletionHandler。(具體這塊還沒細看代碼,后續再分析這塊)
以一個簡單監聽服務端為例,基本過程是: ?
1.??? 啟動一個服務端通道
2.??? 定義一個事件處理器,用戶事件完成的時候處理,如消費數據。
3.??? 向系統注冊一個感興趣的事件,如接受數據,并把事件完成的處理器傳遞給系統。
4.??? 都已經交待完畢,可以只管繼續做自己的事情了,操作系統在完成事件后通過其他的線程會自動調用處理器完成事件處理。
package io.aio;import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel;public class AIOClient {public static void main(String... args) throws Exception {AsynchronousSocketChannel client = AsynchronousSocketChannel.open();client.connect(new InetSocketAddress("localhost", 9888));client.write(ByteBuffer.wrap("test".getBytes())).get();} }
關于AIO的概念,僅談談個人的一點理解。可能不到位,請大家指出。
Io的兩個重要步驟:發起IO請求,和實際的IO操作。在unix網絡編程的定義里異步和非異步概念的區別就是實際的IO操作是否阻塞。如果不是就是異步,如果是就是同步。
而阻塞和非阻塞的區別在于發起IO請求的時候是否會阻塞,如果會就是阻塞,不會就是非阻塞。
本人理解能力有限,想了個例子來輔助自己理解:
小明想要買一本<深入java虛擬機>的書,以下幾個場景可以來理解這幾種io模式:
1.??? 如果小明每天都去書店問售貨員說有沒有這本書,如果沒有就回去繼續等待,等下次再過來文。(阻塞)
2.??? 如果小明告訴售貨員想買一本<深入java虛擬機>的書,那么就在家里等著做其他事情去了,如果書到了售貨員就通知小明,小明再自己過去取。
3.??? 如果小明告售貨員想買一本<深入java虛擬機>的書,然后告訴售貨員到了幫他送到某某地方去,就做其他事情去了。小明就不管了,等書到了,售貨員就幫他送到那個地方了。
售貨員可以認為是操作系統的一個服務,而小明是一個用戶進程。不知道是否有誤,如果有誤請大家拍磚指出,謝謝。
可以看出2,3的效率明顯要比1高。但是1最簡單,而2,3需要一些協作。充分證明了團隊合作的力量。
JDK7 AIO初體驗?
AsynchronousChannel:支持異步通道,包括服務端AsynchronousServerSocketChannel和普通AsynchronousSocketChannel等實現。
CompletionHandler:用戶處理器。定義了一個用戶處理就緒事件的接口,由用戶自己實現,異步io的數據就緒后回調該處理器消費或處理數據。
AsynchronousChannelGroup:一個用于資源共享的異步通道集合。處理IO事件和分配給CompletionHandler。(具體這塊還沒細看代碼,后續再分析這塊)
以一個簡單監聽服務端為例,基本過程是: ?
1.??? 啟動一個服務端通道
2.??? 定義一個事件處理器,用戶事件完成的時候處理,如消費數據。
3.??? 向系統注冊一個感興趣的事件,如接受數據,并把事件完成的處理器傳遞給系統。
4.??? 都已經交待完畢,可以只管繼續做自己的事情了,操作系統在完成事件后通過其他的線程會自動調用處理器完成事件處理。
以下用一個例子來簡單實現,一個服務端和客戶端。服務端監聽客戶端的消息,并打印出來。
package io.aio;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException;/*** * @author noname*/ public class AIOServer {public final static int PORT = 9888;private AsynchronousServerSocketChannel server;public AIOServer() throws IOException {server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(PORT));}public void startWithFuture() throws InterruptedException,ExecutionException, TimeoutException {System.out.println("Server listen on " + PORT);Future<AsynchronousSocketChannel> future = server.accept();AsynchronousSocketChannel socket = future.get();ByteBuffer readBuf = ByteBuffer.allocate(1024);readBuf.clear();socket.read(readBuf).get(100, TimeUnit.SECONDS);readBuf.flip();System.out.printf("received message:" + new String(readBuf.array()));System.out.println(Thread.currentThread().getName());}public void startWithCompletionHandler() throws InterruptedException,ExecutionException, TimeoutException {System.out.println("Server listen on " + PORT);//注冊事件和事件完成后的處理器server.accept(null,new CompletionHandler<AsynchronousSocketChannel, Object>() {final ByteBuffer buffer = ByteBuffer.allocate(1024);public void completed(AsynchronousSocketChannel result,Object attachment) {System.out.println(Thread.currentThread().getName());System.out.println("start");try {buffer.clear();result.read(buffer).get(100, TimeUnit.SECONDS);buffer.flip();System.out.println("received message: "+ new String(buffer.array()));} catch (InterruptedException | ExecutionException e) {System.out.println(e.toString());} catch (TimeoutException e) {e.printStackTrace();} finally {try {result.close();server.accept(null, this);} catch (Exception e) {System.out.println(e.toString());}}System.out.println("end");}@Overridepublic void failed(Throwable exc, Object attachment) {System.out.println("failed: " + exc);}});// 主線程繼續自己的行為while (true) {System.out.println("main thread");Thread.sleep(1000);}}public static void main(String args[]) throws Exception {new AIOServer().startWithCompletionHandler();} }
package io.aio;import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel;public class AIOClient {public static void main(String... args) throws Exception {AsynchronousSocketChannel client = AsynchronousSocketChannel.open();client.connect(new InetSocketAddress("localhost", 9888));client.write(ByteBuffer.wrap("test".getBytes())).get();} }
服務端寫了兩種處理實現方式,startWithCompletionHandler是通過Handler來處理,startWithFuture是通過Future方式來處理。startWithCompletionHandler方法里可以看到調用accepte()完成異步注冊后,線程就可以繼續自己的處理了,完全不被這個io所中斷。
從以上來看AIO的代碼簡單了很多,至少比NIO的代碼實現簡單很多。
?
本文理解暫處于體驗階段,深入學習還待后面,歡迎一起交流。
????
參考資料?
http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
http://blog.csdn.net/roger_77/article/details/1555170
http://download.oracle.com/javase/tutorial/essential/io/file.html
總結
以上是生活随笔為你收集整理的java7 AIO初体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: commons dbutils 的介绍与
- 下一篇: BIO、NIO、AIO的区别——Nett