java線程調(diào)度
線程調(diào)度主要有兩種方式详羡,協(xié)同式線程調(diào)度和搶占式線程調(diào)度耕渴。
1邮破、協(xié)同式:
? ? ?線程的執(zhí)行時間由線程本身來控制,線程把自己的任務執(zhí)行完之后壶谒,才會主動通知系統(tǒng)切換到另外一個線程中云矫。
? ? ?優(yōu)點:實現(xiàn)方式簡單,切換操作對自己可知汗菜,沒有線程同步的問題
? ? ?缺點:線程執(zhí)行時間不可控制让禀,如果線程編寫有問題,會一直阻塞陨界,相當不穩(wěn)定巡揍。
2、搶占式:
? ? ?線程將有系統(tǒng)來分配執(zhí)行時間菌瘪,線程切換不是有本身來確定腮敌,除了調(diào)用Thread.yied()來讓出cpu資源。
? ? 優(yōu)點:執(zhí)行時間系統(tǒng)可控麻车,不會導致阻塞的問題缀皱。java就是搶占式調(diào)度
java線程有10個優(yōu)先級,可以設置優(yōu)先級來建議系統(tǒng)的線程調(diào)度动猬,但不是很靠譜,因為java線程還是通過映射到系統(tǒng)的線程上實現(xiàn)的表箭,所以最終還是取決于操作系統(tǒng)赁咙。而且優(yōu)先級可能會被系統(tǒng)自行改變。
線程狀態(tài)
java中定義了5中線程狀態(tài),在任意一個時間點彼水,一個線程只有其中的一種狀態(tài)崔拥。
(1)新建(New) 創(chuàng)建后尚未啟動。
(2)運行(Runnable):包括了操作系統(tǒng)線程狀態(tài)中的Running和Ready,即處于這個狀態(tài)的線程可能正在執(zhí)行凤覆,也可能是等待cpu分配執(zhí)行時間链瓦。
(3)無限期等待(Waiting):出于該狀態(tài)時,線程不會被分配cpu執(zhí)行時間盯桦,要等待被其他線程顯式地喚醒慈俯。有幾個方法會讓線程陷入這種狀態(tài):a.沒有超時時間的Object.wait() ;b.沒有超時時間的Thread.join(); c.LockSupport.park().
(4)限期等待(Timed Waiting):出于這種狀態(tài)的線程也不會被分配cpu執(zhí)行時間,不過無需被其他線程顯式地喚醒拥峦,一定時間后就可以由系統(tǒng)自動喚醒贴膘。有幾個方法可以使線程進入這種狀態(tài):a.Thread.sleep(); b.設置了超時時間的Object.wait(); c.設置了超時時間的Thread.join(). d.LockSupport.parkNanos(); e.LockSupport.parkUntil().
(5)阻塞(Blocked):線程被阻塞了,與等待狀態(tài)的區(qū)別是略号,阻塞狀態(tài)在等待獲取到一個排他鎖刑峡,就是等待另一個線程放棄這個鎖。而等待狀態(tài)則是在等一段時間玄柠,或者喚醒動作的發(fā)生突梦。在線程等待進入同步區(qū)域的時候,線程將進入這種狀態(tài)羽利。
(6)結束(Terminated):線程已經(jīng)結束執(zhí)行阳似。