1. 程式人生 > >理解JAVA nio非阻塞

理解JAVA nio非阻塞

這幾天在看JAVA nio相關的東西,網上資料說nio是非阻塞的,我實在理解不到這句話的意思;

比如我用nio來複制檔案,那一句程式碼表示非阻塞呢?我冥思苦想,實在想不出。

public static void main(String[] args) throws Exception {
		File src = new File("D:\\tool/iToolsSetup_4.2.0.6.exe");
		FileInputStream fis = new FileInputStream(src);
		FileOutputStream fos = new FileOutputStream(new File("D:/iToolsSetup_4.2.0.6.exe"));
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		FileChannel channelin = fis.getChannel();
		FileChannel channelout = fos.getChannel();		
		while (channelin.read(buffer) != -1) {
			System.out.println("--");
			buffer.flip();
			channelout.write(buffer);
			buffer.clear();
		}
		fis.close();
		fos.close();
		System.out.println("over");
	}

其實我犯了一個錯誤,其實網上大家所說的nio非阻塞的預設場景都是網路程式設計這一塊,因為大家舉的例子都是什麼ServerSocketChannel,SocketChannel;(以上用nio複製檔案的操作我完全沒有看出來什麼地方有非阻塞)

繞了一大大圈子,其實大家口中所說的非阻塞都是在通訊過程中傳送和接收資訊;

對比ServerSocket/Socket(流/IO)程式設計和ServerSocketChannel/SocketChannel(nio)程式設計

我們看前者服務端程式碼中往往會新建一個單獨的執行緒去處理獲得的請求(這都是預設程式碼的寫法了,網上都這麼寫),然後使用while((info=br.readLine())!=

null)來判斷客戶端是否有輸入,這就是實際阻塞的地方。

使用後者(nio)程式設計時,其實現機制是程式碼中迴圈的去判斷通道中是否有資訊到達,然後再去呼叫對應的方法及分支處理資訊;

但我認為這都是設計上的問題(程式碼寫法的問題)

前者我覺得也可以完全不寫成用多執行緒來處理,服務端可以把所有獲得的socket物件放在一個集合裡,然後輪詢裡面每個socket是否有資料接收再呼叫對應的方法,這就跟nio一貫程式碼寫法有點類似了

這裡的什麼阻塞和非阻塞我理解都是程式碼設計上的東西,誰叫你那麼寫程式碼呢;

關注點

其實我們關注nio應該更多的關注的是,Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。

阻塞與非阻塞我覺得這篇文章寫得不錯

http://blog.csdn.net/robinjwong/article/details/41786919