乙個執行緒的週期

2021-09-27 03:28:31 字數 2090 閱讀 2746

乙個執行緒的週期分為5部分:

1 ,新生狀態

2,就緒狀態

3,執行狀態

4,阻塞狀態

5,死亡狀態

1 ,新生狀態

乙個執行緒剛剛new出來的時候 

2,就緒狀態

呼叫 thread.start() 方法  告訴cpu 一切就緒 等待呼叫

分配工作空間 給各個執行緒,執行緒通過 工作空間與 主記憶體 互動,進行拷貝資料 等操作;

一般來說有四種方法 到達就緒狀態 

1,start();

2,解除阻塞,重新進入就緒;

3,yield;

4,jvm從執行緒從本地執行緒切換到其他執行緒 也會 引起 就緒狀態,一般有演算法完成。

3,執行狀態

獲得執行權

cpu 呼叫run 方法 ,執行程式

4,阻塞狀態

失去執行權

程式進入阻塞狀態,等待著,會回到就緒狀態, cpu呼叫後再到執行狀態;

阻塞狀態的四種原因;

1,sleep(1000);

抱著資源睡覺,不放開鎖。 等待多少秒;

。可以模擬網路延時,倒計時等;

。每一物件都有鎖,sleep不會釋放鎖;

。sleep 是執行緒體的乙個靜態方法,誰呼叫,讓誰阻塞。

。時間到了進入就緒狀態

2,wait;

不占用資源,就等著。

3,join;

插隊 等別人操作完 再進行

4,io操作 read/write;

必須等待作業系統去排程

5,死亡狀態

程式執行完畢 或者 被迫終止

乙個執行緒死亡就真的死亡了,不會回到 新生狀態,呼叫 start方法也沒有用

強制終止方法有兩種 stop 和 destory 不推薦 ,因為過時了 ,且執行緒不安全;

可以使用標識位來終止程式,替代 stop 和 destory

總結一下就是 最好讓程式自己走完,如果不能,也要想方設法讓程式自己走完;

詳細說一下幾個執行緒的使用

1, yield  高風亮節禮讓執行緒

yield是thread的乙個靜態方法

yield會讓執行緒讓出cpu排程,從執行直接走到就緒狀態,讓cpu重新排程,但是也會禮讓失敗。

package y.i.d;

public class testyield }

class myyield implements runnable

}

package y.i.d;

public class testyield

}) .start();

for (int i = 0; i < 10; i++)

system.out.println("main");

} }}

class myyield implements runnable

}

2.join 插隊執行緒 等待該執行緒執行完畢 才能繼續執行下乙個執行緒,看起來就是合併為乙個執行緒了;

join的執行緒一旦 join 就必須走完,才會走原來的執行緒

package y.i.d;

public class testjoin

});t.start();

for (int i = 1; i < 10; i++)

system.out.println("main");

} }

}

package y.i.d;

public class buysmoke

}class father implements runnable catch (interruptedexception e)

system.out.println("老爸接過煙,把零錢給了兒子");

}}class son implements runnable

system.out.println("想起買菸了");

system.out.println("到商店");

system.out.println("買到煙回去了");

}}

終止乙個執行緒

可以讓執行緒呼叫exitthread函式,以便強制執行緒終止執行 函式原型 void exitthread dword dwexitcode 該函式將終止執行緒的執行,並導致作業系統清除該執行緒使用的所有作業系統資源。但是,c 資源 如c 類物件 將不被撤消。由於這個原因,最好從執行緒函式返回,而不...

在乙個執行緒加鎖,另乙個執行緒解鎖

一般來講,乙個執行緒加鎖,另乙個執行緒解鎖,是很容易死鎖的。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。4 迴圈等待條件 若干程序之間形成...

java 乙個執行緒控制另乙個執行緒

兩種方法,乙個用標記變數,另乙個用語法 不多說,直接 主方法一 send s new send s.start receive r new receive r.start class send extends thread s system.out.println s sleep 500 catch...