執行緒的狀態轉換

2021-05-28 00:53:42 字數 1000 閱讀 1824

執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態:分別是生、死、可執行、執行、等待/阻塞。

對於執行緒的阻止,考慮一下三個方面,不考慮io阻塞的情況:

1.  睡眠; 2.等待; 3.因為需要乙個物件的鎖定而被阻塞。

睡眠:thread.sleep(long millis)和thread.sleep(long millis, int nanos)靜態方法強制當前正在執行的執行緒休眠(暫停執行),以「減慢執行緒」。當執行緒睡眠時,它入睡在某個地方,在甦醒之前不會返回到可執行狀態。當睡眠時間到期,則返回到可執行狀態。

實現睡眠:呼叫靜態方法。

try catch (interruptedexception e)

2執行緒的優先順序和執行緒讓步yield();

執行緒的讓步是通過thread.yield()來實現的。yield()的方法的作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。

3.thread.yield()方法 

thread.yield()方法作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。

yield()應該做的是讓當前執行執行緒回到可執行狀態,以允許具有相同優先順序的其他執行緒獲得執行機會。因此,使用yield()的目的是讓相同優先順序的執行緒之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中。

join()方法

thread的非靜態方法join()讓乙個執行緒b「加入」到另外乙個執行緒a的尾部。在a執行完畢之前,b不能工作。例如:

thread t = new mythread();

t.start();

t.join();

另外,join()方法還有帶超時限制的過載版本。 例如t.join(5000);則讓執行緒等待5000毫秒,如果超過這個時間,則停止等待,變為可執行狀態。 

執行緒的合併的含義就是將幾個並行執行緒的執行緒合併為乙個單執行緒執行,應用場景是當乙個執行緒必須等待另乙個執行緒執行完畢才能執行時可以使用join方法。

執行緒的狀態轉換

從執行緒被建立到執行完畢共經過了五個階段 新建 可執行 執行 等待 阻塞 睡眠 終止。關係圖如下所示 新狀態 new 執行緒以建立,但未呼叫任何方法 可執行狀態 runnable 已呼叫start 方法,進入就緒狀態,或程式剛從等待 阻塞 睡眠狀態回來,等待執行 執行狀態 run 程式在正常執行 等...

執行緒的狀態轉換

執行緒的狀態有 new runnable running waiting timed waiting blocked dead 當執行new thread runnabler 後,新建立出來的執行緒處於new狀態,這種執行緒不可能執行 當執行thread.start 後,執行緒處於runnable狀...

執行緒的狀態轉換

注 拿到物件的鎖標記,即為獲得了對該物件 臨界區 的使用許可權。即該執行緒獲得了執行所需的資源,進入 就緒狀態 只需獲得cpu,就可以執行。因為當呼叫wait 後,執行緒會釋放掉它所占有的 鎖標誌 所以執行緒只有在此獲取資源才能進入就緒狀態。停止執行緒 flag標誌 不推薦使用jdk提供的stop ...