1. 線程在運行的過程中因為某些原因而發生阻塞,阻塞狀態的線程的特點是:該線程放棄CPU的使用,暫停運行,只有等到導致阻塞的原因消除之后才回復運行。或者是被其他的線程中斷,該線 程也會退出阻塞狀態,同時拋出InterruptedException。 導致阻塞的原因有很多種,大致分為三種來討論,分別是一般線程中的阻塞,Socket客戶端的阻塞,Socket服務器端的阻塞。
一般線程中的阻塞:
A、線程執行了Thread.sleep(int millsecond);方法,當前線程放棄CPU,睡眠一段時間,然后再恢復執行
B、線程執行一段同步代碼,但是尚且無法獲得相關的同步鎖,只能進入阻塞狀態,等到獲取了同步鎖,才能回復執行。
C、線程執行了一個對象的wait()方法,直接進入阻塞狀態,等待其他線程執行notify()或者notifyAll()方法。
D、線程執行某些IO操作,因為等待相關的資源而進入了阻塞狀態。比如說監聽system.in,但是尚且沒有收到鍵盤的輸入,則進入阻塞狀態。
Socket客戶端的阻塞:
A、請求與服務器連接時,調用connect方法,進入阻塞狀態,直至連接成功。
B、當從Socket輸入流讀取數據時,在讀取足夠的數據之前會進入阻塞狀態。比如說通過BufferedReader類使用readLine()方法時,在沒有讀出一行數據之前,數據量就不算是足夠,會處在阻塞狀態下。
C、調用Socket的setSoLinger()方法關閉了Socket延遲,當執行Socket的close方法時,會進入阻塞狀態,知道底層Socket發送完所有的剩余數據
Socket服務器的阻塞:
A、線程執行ServerSocket的accept()方法,等待客戶的連接,知道接收到客戶的連接,才從accept方法中返回一個Socket對象
B、從Socket輸入流讀取數據時,如果輸入流沒有足夠的數據,就會進入阻塞狀態
D、線程向Socket的輸出流寫入一批數據,可能進入阻塞狀態
2. 當程序阻塞時,會降低程序的效率,於是人們就希望能引入非阻塞的操作方法。 所謂非阻塞方法,就是指當線程執行這些方法時,如果操作還沒有就緒,就立即返回,不會阻塞着等待操作就緒。 Java.nio 提供了這些支持非阻塞通信的類。