乙個執行緒的週期分為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...