1.阻塞非阻塞異步同步是針對方法說的,是評判一個方法運行狀態的。和多線程完全兩個級別。
2.阻塞非阻塞異步同步是針對方法說的,是評判一個方法運行狀態的。和多線程完全兩個級別。
3.阻塞非阻塞異步同步是針對方法說的,是評判一個方法運行狀態的。和多線程完全兩個級別。
2.多線程只是能用來避免阻塞或者同步方法時的效率低問題
1.多線程和阻塞及非阻塞一點關系沒有。并不是多線程就非阻塞了。
2.比如socket讀取http request數據時,肯定是要多線程讀取的,每個連接對應一個線程去讀。因為傳統的socket的accept(),send()這些方法是阻塞的,程序就會一直等。所以?
就要開啟多線程保證程序能向下運行,但是每個線程內讀取request時,線程內又是阻塞的。所以多線程和阻塞非阻塞沒關系的。
3.多線程和非阻塞(異步)的關系?一點關系沒有!即使一個線程也可以是非阻塞或者異步運行的
4.阻塞非阻塞異步同步是針對方法說的,是評判一個方法運行狀態的。
3.所以通常在Java中處理阻塞I/O要用到線程(大量的線程)。代碼如下
try
{
ServerSocket ss = new
ServerSocket(10000);
System.out.println("server start...");
while
(true) {
Socket s = ss.accept();
new
LogicThread(s);//開一個線程來處理請求,這里面調用InputStream.read()讀取請求信息
}
?
} catch
(Exception e) {
e.printStackTrace();
}
}
}
4.可以分析創建服務器的每個具體步驟。首先創建ServerSocket,然后接受新的連接請求,在LogicThread中處理請求。
傳統IO方式(阻塞I/O)在調用InputStream.read()/buffer.readLine()方法時是阻塞的,它會一直等到數據到來或緩沖區已滿時或超時時才會返回,并且產生了大量String類型?
垃圾,盡管可以使用StringBuffer優化;同樣,在調用ServerSocket.accept()方法時,也會一直阻塞到有客戶端連接才會返回,每個客戶端連接過來后,服務端都會啟動一個線?
程去處理該客戶端的請求。并且多線程處理多個連接。每個線程擁有自己的棧空間并且占用一些 CPU 時間。每個線程遇到外部未準備好的時候,都會阻塞掉。阻塞的結果就是會?
帶來大量的進程上下文切換。且大部分進程上下文切換可能是無意義的。比如假設一個線程監聽某一個端口,一天只會有幾次請求進來,但是該 cpu 不得不為該線程不斷做上下?
文切換嘗試,大部分的切換以阻塞告終。
5.非阻塞式I/O(NIO):也可以說成“New I/O”?
核心類:?
1.Buffer 為所有的原始類型提供 (Buffer) 緩存支持。?
2.Charset 字符集編碼解碼解決方案?
3.Channel 一個新的原始 I/O 抽象,用于讀寫Buffer類型,通道可以認為是一種連接,可以是到特定設備,程序或者是網絡的連接。通道的類等級結構圖如下
10.4.Selector?
在過去的阻塞I/O中,我們一般知道什么時候可以向stream中讀或寫,因為方法調用直到stream準備好時返回。但是使用非阻塞通道,我們需要一些方法來知道什zid