java從入門到精通 十八章 多執行緒

2021-09-23 17:10:45 字數 3175 閱讀 2441

多執行緒這個概念在經過一段時間的開發後,考慮介面等問題的時候很容易考慮到。比如做電商系統中庫存搶購,車票購買的時候如何控制等問題,根本原因就在於乙個多執行緒安全問題,本章提出的解決方法時通過同步**快的方式,將多執行緒非同步問題 改為多執行緒同步,這樣無論下單的是誰,都是經過一筆一筆單子來處理,這樣就不會出現多執行緒等問題.當然也可以通過訊息佇列等方式來控制,下單的時候都需要排隊,或者通過其他方式實現多執行緒併發 資料安全等問題.這裡暫不做討論,這裡來回顧下多執行緒的一些概念性問題.

程序/執行緒的介紹

計算機作業系統中 任務管理器管理多個程序,系統將分配給每乙個程序一段cpu時間片,乙個程序的時間片執行完畢,執行另乙個程序的cpu時間片,因為每乙個cpu時間片都非常短,所以看起來就像是 同時在執行多個任務一樣.有點像動畫的似得,本質就是多個組成的動畫。只不過感覺不出來而已。而執行緒就是程序中將系統分配的cpu時間片 再次劃分,分配到執行緒的時間片就更短。

建立執行緒的2種方式

建立的執行緒類實現runnable介面,實現介面中的run方法,然後通過建立thread,通過thread(runnable target)的構造方法將 執行緒類例項化,呼叫thread的start方法 將執行緒由建立狀態進入就緒狀態.

package core.thread;

public class threadtest2 implements runnable

} }public static void main(string args)

}

建立執行緒類 繼承thread類,重寫其中的run方法。然後 通過繼承的thread類的strart()方法,啟動執行緒。同時這個thread類 實際上是實現runnable介面的run方法的.

執行緒的生命週期執行緒從建立到銷毀存在7個生命週期.

建立:執行緒通過繼承thread或實現runnable的方式建立類,執行緒就被建立了

就緒:執行緒通start方法 啟動執行緒,執行緒進入就緒狀態,等待cpu時間片分配進入執行狀態.

執行:執行緒分配到cpu時間片,開始執行

阻塞:執行緒執行後,等待輸入或者輸出命令,在此期間為阻塞狀態.

休眠:執行緒執行sleep方法,進行休眠狀態,休眠時間過去了,重新進入就緒狀態.

等待:執行緒執行wait方法,進行執行緒等待狀態.可以ton過notify喚醒執行緒

死亡:執行緒執行完畢,銷毀了。處於死亡狀態.

用一張圖就這麼表示了.

執行緒狀態切換的方法

使執行緒處於就緒狀態的方法

start方法/程序輸入輸出 執行完畢/sleep執行緒剛休眠結束/wait執行緒等待完畢

執行緒由就緒狀態 進入執行狀態的方法

執行緒等待呼叫notify方法執行緒喚醒/notifyall喚醒所有的執行緒(也就是說執行緒等待完畢 處於就緒狀態/如果呼叫notify時不等待了 直接進入執行狀態了 相當於 插隊 開掛了)/interrupt執行緒中斷(當乙個執行緒處於就緒狀態 直接打斷狀態)/執行緒阻塞完畢/執行緒休眠狀態

操作執行緒的方法

執行緒休眠 sleep(long time); 毫秒為單位 long型別

執行緒加入join(); a執行緒中的run方法執行join(thread b)執行緒,這樣就會先執行b執行緒,然後才執行a執行緒。類似於插隊.

執行緒中斷.interrupted()之前有個stop方法 不用了.

執行緒禮讓yield。不保證禮讓結果。

執行緒優先順序

從1到10自小而大 優先順序一層層提高. 正常的為normal_priority.最小的為min_priority.最大的為max_priority.優先順序越高,相同時間片段下,優先順序高的在前面先執行.

執行緒同步安全問題

synchornize是控制多執行緒的最簡單的方法,但是僅是在業務量不大的情況下,通過執行緒同步來防止資料混亂的問題,舉個最簡單的例子,賣車票在最後一張的時候,如果多個人都下單了,下單之後有一一系列業務資料操作,耗時比較長,雖然可以考慮解耦,但如果網路 效能等問題造成 前乙個人下單再判斷庫存大於0,開始做業務處理 庫存-1的操作時,後面乙個人也下單 然後庫存也大於0 ,開始操作,這樣就可能出現庫存數量為-1的情況。所以就需要通過synchronzied同步**塊或者同步方法的形式,將多執行緒通過類似訊息佇列的方式一次次處理,這樣就可以避免執行緒安全的問題,例子如下.

package core.thread;

public class threadsafe implements runnable catch (interruptedexception ex)

system.out.println("tickets:" + num--);

}}*/

//利用synchornzied同步方法

doit();

} }private void doit() catch (interruptedexception ex)

system.out.println("tickets:" + num--);

}} }

public static void main(string args)

}

執行結果

tickets:10

tickets:9

tickets:8

tickets:7

tickets:6

tickets:5

tickets:4

tickets:3

tickets:2

tickets:1

JAVA從入門到精通(4)

一 條件語句之if 語法 if 條件 解釋 需要先判斷條件,條件滿足後才執行後續的 注 如果if條件成立時的執行語句只有一條,是可以省略大括號的 但是執行語句有多條,那就不可以省略了。二 條件語句之if.else 語法 if 條件的布林表示式 else 解釋 條件成立時,則執行if部分的 塊 條件不...

Nginx從入門到精通

1 nginx配置檔案載入機制 採用nginx s reload命令載入nginx的配置檔案,master程序讀取配置檔案,建立新的worker程序,向老的worker程序傳送shutdown命令。老的worker程序不再接受新的請求,待老的請求處理完成後,就會停掉。2 location匹配機制 當...

scrot 從入門到精通

無論是撰寫技術教程,還是展示桌面或應用,恐怕 scrot 都是必不可少的工具。scrot 是螢幕抓圖工具中的 皎皎 佼佼者,它小巧而不失為強大,精練而不缺少靈活。scrot 主要用在命令列下,它使用 imlib2 庫來抓取並儲存影象。在 ubuntu 中,可以使用sudo apt get insta...