1. 程式人生 > >Java執行緒喚醒與阻塞常用方法

Java執行緒喚醒與阻塞常用方法

如果執行緒是因為呼叫了wait()sleep()或者join()方法而導致的阻塞,可以中斷執行緒,並且通過丟擲InterruptedException來喚醒它;如果執行緒遇到了IO阻塞,無能為力,因為IO是作業系統實現的,Java程式碼並沒有辦法直接接觸到作業系統。以下是詳細的喚醒方法:

1. sleep() 方法:

sleep(毫秒),指定以毫秒為單位的時間,使執行緒在該時間內進入執行緒阻塞狀態,期間得不到cpu的時間片,等到時間過去了,執行緒重新進入可執行狀態。(暫停執行緒,不會釋放鎖)

2.suspend() resume() 方法:

掛起和喚醒執行緒,suspend e()使執行緒進入阻塞狀態,只有對應的

resume e()被呼叫的時候,執行緒才會進入可執行狀態。(不建議用,容易發生死鎖)

3. yield() 方法:

會使的執行緒放棄當前分得的cpu時間片,但此時執行緒任然處於可執行狀態,隨時可以再次分得cpu時間片。yield()方法只能使同優先順序的執行緒有執行的機會。呼叫 yield()的效果等價於排程程式認為該執行緒已執行了足夠的時間從而轉到另一個執行緒。(暫停當前正在執行的執行緒,並執行其他執行緒,且讓出的時間不可知)

4.wait() notify() 方法:

兩個方法搭配使用,wait()使執行緒進入阻塞狀態,呼叫notify()時,執行緒進入可執行狀態。wait()內可加或不加引數,加引數時是以毫秒為單位,當到了指定時間或呼叫

notify()方法時,進入可執行狀態。(屬於Object類,而不屬於Thread類,wait()會先釋放鎖住的物件,然後再執行等待的動作。由於wait()所等待的物件必須先鎖住,因此,它只能用在同步化程式段或者同步化方法內,否則,會丟擲異常IllegalMonitorStateException.

5.join()方法:

也叫執行緒加入。是當前執行緒A呼叫另一個執行緒Bjoin()方法,當前執行緒轉A入阻塞狀態,直到執行緒B執行結束,執行緒A才由阻塞狀態轉為可執行狀態。

以上是Java執行緒喚醒和阻塞的五種常用方法,不同的方法有不同的特點,其中wait() notify()是其中功能最強大、使用最靈活的方法,但這也導致了它們效率較低、較容易出錯的特性,因此,在實際應用中應靈活運用各種方法,以達到期望的目的與效果!