什麼導致執行緒阻塞?

2021-09-25 13:43:38 字數 1559 閱讀 9795

導致執行緒阻塞的原因主要有以下幾方面。

1、執行緒進行了休眠:執行緒執行了thread.sleep(int n)方法,執行緒放棄cpu,睡眠n毫秒,然後恢復執行。

2、執行緒要執行一段同步**,由於無法獲得相關的同步鎖,只好進入阻塞狀態,等到獲得了同步鎖,才能恢復執行。

3、執行緒執行wait()進入阻塞狀態:執行緒執行了乙個物件的wait()方法,進入阻塞狀態,只有等到其他執行緒執行了該物件的notify()或notifyall()方法,才可能將其喚醒。

4、執行緒執行i/o操作或進行遠端通訊時,會因為等待相關的資源而進入阻塞狀態。(

例如,當執行緒執行system.in.read()方法時,如果使用者沒有向控制台輸入資料,則該執行緒會一直等讀到了使用者的輸入資料才從read()方法返回。進行遠端通訊時,在客戶程式中,執行緒在以下情況可能進入阻塞狀態。)

5、請求連線時:請求與伺服器建立連線時,即當執行緒執行socket的帶引數的構造方法,或執行socket的connect()方法時,會進入阻塞狀態,直到連線成功,此執行緒才從socket的構造方法或connect()方法返回。

6、讀取執行緒等待資料:執行緒從socket的輸入流讀取資料時,如果沒有足夠的資料,就會進入阻塞狀態,直到讀到了足夠的資料,或者到達輸入流的末尾,或者出現了異常,才從輸入流的read()方法返回或異常中斷。(

輸入流中有多少資料才算足夠呢?這要看執行緒執行的read()方法的型別。

int read()

只要輸入流中有乙個位元組,就算足夠。

int read(byte buff)

只要輸入流中的位元組數目與引數buff陣列的長度相同,就算足夠。

string readline()

只要輸入流中郵一行字串,就算足夠。值得注意的是,inputstream類並沒有readline方法,在過濾流bufferedreader類中才有此方法。 )

7、執行緒寫資料時可能會出現:執行緒向socket的輸出流寫一批資料時,可能會進入阻塞狀態,等到輸出了所有的資料,或者出現異常,才從輸出流的write()方法返回或異常中斷。

8、呼叫socket關閉連線時阻塞直到發完資料:呼叫socket的setsolinger()方法設定了關閉socket的延遲時間,那麼當執行緒執行socket的close方法時,會進入阻塞狀態,直到底層socket傳送完所有剩餘資料,或者超過了setsolinger()方法設定的延遲時間,才從close()方法返回。

tornado介面阻塞導致主線程阻塞

tornado推薦是多程序 協程的方式執行,ioloop.current start 單個介面阻塞,會導致整個服務阻塞,所以一般介面邏輯中要使用非阻塞的方法。比如time.sleep 5 應該更換為yield gen.sleep 5 這樣就可以將資源讓給其他介面處理,該介面仍然會阻塞,等同於time...

IOS usleep函式導致執行緒阻塞

今天除錯ios程式,由於程式裡面使用了稍微的延時,就隨手寫了usleep函式,使用了幾個月沒啥問題,結果今天竟然阻塞了整個執行緒,讓程式出不來了,經查證原來usleep函式有那麼多問題,特記錄!哈哈 usleep 有有很大的問題 1.在一些平台下不是執行緒安全,如hp ux以及linux 2.usl...

多執行緒 非阻塞通訊導致多次處理讀事件

簡單的解釋一下,事件處理器handler有乙個handle selectionkey 方法,根據方法的不同,執行不同的操作。對於讀事件,建立乙個執行緒進行讀事件處理。public class mutithreadserver private static class eventhandler pub...