邀請好友學習
每邀請一位你將得 ¥
隨著 CPU 的發展從提高頻率轉變為增加內核,如何利用好 CPU 的多核優勢,變得日益重要,程序開發中采用多線程來提高效率也變得更為普遍。但多線程是把雙刃劍,在提高計算效率的同時,也帶來了開發的復雜度,因此需要我們對多線程開發有足夠的認知,才能確保多線程程序正確運行。此外,多線程的知識也是面試中必考的知識點,要想拿下理想的職位,對多線程的深入學習是必不可少的。
不知你對多線程開發是否有過這樣的困惑: 做了幾年 Java web 開發,并沒有寫過多線程,但開發的軟件一樣高效、穩定運行,似乎多線程看起來并沒有那么重要?其實不然。在你的代碼背后,web 容器已經幫你實現了多線程,所有的請求都是單獨的線程在并發處理。
多線程在軟件領域的應用其實十分普遍,主要原因有如下幾點:
避免 CPU 閑置
假如在一個業務操作中包含對另外兩個服務的調用,并且沒有依賴關系。如果采用單線程,就需要等待第一個服務返回結果后再發出第二個請求,但其實在第一個請求發出后,CPU 就已經空閑了,大量時間花在了等待請求返回上。而如果采用多線程,同時發出兩個請求,總的等待時間將會大大縮短。
程序解耦
程序基本上都是由一個個方法的調用所組成。方法 A 返回結果傳遞給方法 B 繼續處理。也可以是方法 A 和方法 B 產生的結果一塊傳遞給方法 C 進一步處理。這其實這就是生產者和消費者。我們通過多線程,可以把邏輯以恰當的力度接耦,一個線程負責生產,另外一個線程負責消費。兩個線程互不依賴,并且通過隊列起到了緩沖的作用。這就像我們去飯店吃飯,前臺負責收費接單,后廚按訂單列表進行加工,這是典型的多線程。絕對不會有一個飯館前臺收完錢后,自己再去后廚炒菜。
提升性能
一個人干活和一群人干活哪個更快?答案顯而易見,程序也是如此。一般來說,線程越多性能也越好。不過在達到峰值后,再增加線程也不能繼續提升性能。舉個例子,你的經理讓你做工作量評估。你說:我一個人要干十天。經理說:那兩個人,5 天能干完嗎?你想了想說:應該差不多。經理說:那我給你加 9 個人,1 天能搞定嗎?顯然這是不行的。
貼近現實世界
我們生活的世界其實就是一個多線程的世界,可以認為每個人都是一個線程。而我們平時所做的絕大多數工作,都是多人完成的,也就是多線程完成。我們做軟件設計時,都會參考現實世界中的類似設計。所以多線程是必不可少的設計要素之一。Java 是面向對象的語言,我們的代碼都已經面向對象了,為什么我們編寫的對象還要以單線程的方式運行呢?所以使用多線程就是這么自然而然的一件事情。更加貼近真實世界,意味著你的設計更加易于理解,并且不會有什么漏洞。
掌握了多線程開發,在必要時運用得當,將會讓你的程序在以上幾個層面有顯著的提升。因此,作為一名開發人員,多線程開發是必備技能。此外,我們使用的開源軟件,絕大多數都會用到多線程。學習多線程,對于我們理解開源軟件代碼將會帶來很大的幫助。
多線程開發在 Java 中屬于高階的開發技術,如果能徹底掌握,并且靈活運用。無論是對未來升職或找到理想的工作,都有非常重要的作用。如今的技術面試,多線程知識幾乎是必考的。因此,多線程這一關是要必過的。
講師李一鳴,2006 年畢業于北京航空航天大學后,一直從事 Java 領域的軟件開發,有著豐富的開發經驗。曾經就職于聯想集團,負責全球化系統的研發。后來在法律互聯網行業創業,作為核心成員之一開發了多款法律互聯網應用。目前作為高級研發顧問,就職于 Thoughtworks。在這里能夠把更多的時間投入到技術本身,而這是技術人員的立命之本。業余時間參與了 Apache Pulsar 的中文文檔翻譯工作。為了增加大家的學習趣味,李一鳴老師親手繪制了許多生動有趣的漫畫插圖,并采用現實中的案例進行類比講解,幫助大家理解學習內容,專欄閱讀更加輕松高效。
本專欄采用的結構如下:
1、初入職場,有簡單的 Java 開發基礎,想要從基礎開始學習 Java 多線程開發。
2、有 3-5 年甚至更多開發經驗,想要深入了解 Java 多線程開發。
3、學習過多線程,想要了解在實際項目中如何應用。
4、準備跳槽面試,想要全方位,較為深入的學習多線程。
下載慕課網APP
更好的體驗,讓閱讀隨處可得
如無法下載使用圖片另存為
下載海報
Edingbrugh
筆者很有見解。寫的不錯之前沒有認真的讀讀,讀了好幾次了受益頗多。期待下一個專欄。加油
業精于勤荒于嬉行成于思毀于隨2019
寫的不錯呀,果然是大佬
向遠之航
我反而覺得這樣的安排挺好的,在深入線程池之前,自己的思路沒有被侵染,自己動手來實現一個線程池更能體會其中的精妙之處。當然,這個雖簡單但卻設計精奧的線程池,著實花了不少時間來理解每一個類的功能,感覺類之間層層相關,需要反復揣摩。