-
1 # H哥聊Java
-
2 # 此生唯一
多執行緒作為JAVA學習的主要難點之一,有開發複雜,出現問題難以復現等特性,但卻是不得不掌握的知識點,因為JAVA中使用多執行緒的場景實在是太多了。
先看下多執行緒(所有語言)的發展背景:早期的計算器都是單核CPU,想要獲得更高的效能只能是擴充套件硬體(摩爾定律),但是很快硬體的發展達到了瓶頸,要提高計算能力只能是橫向擴充套件(增加計算機CPU核心,現在也沒有單核心的計算機了吧),因為一個CPU在同一個時間點上只能處理一個執行緒,現在的伺服器少則16核,如果使用單執行緒程式設計,相當於你只用了1/16的CPU資源,暴殄天物!所以多執行緒是很有必要學習的。
多執行緒可以用來在什麼場景使用呢?
1,密集型計算:將一個大任務進行拆分,使用多執行緒進行執行,假設從1加到100萬,你單執行緒需要8分鐘,然後你分為16個執行緒做計算(半分鐘),加上彙總的時間和建立銷燬執行緒的時間,不會超過一分鐘,7分鐘喝咖啡足夠了吧。
下載大檔案的時候拆分成幾個小檔案,充分利用頻寬!
2,非同步呼叫:多執行緒和非同步不是一個概念,但是非同步一定是多執行緒的,如果是同步呼叫發生阻塞的時候,CPU資源就浪費了,但如果是非同步,可以執行別的執行緒,提高CPU使用率!
3,web容器技術:一個請求使用一個執行緒去處理(多數容器已棄用,改用netty架構,一個執行緒遍歷連線,分發給執行緒池進行任務處理)
4,執行緒池:例如資料庫連線池,JAVA中的執行緒池等,執行緒池建立多個執行緒來處理資料,避免頻繁建立執行緒的開銷!
5,批處理:用於多個batch任務可並行處理,batch任務中的job可並行處理的情況!
可以說多執行緒代表著高效率的執行程式,所以有很大的理由學習好多執行緒!
怎麼學好多執行緒呢?
①,明白計算機原理:多核CPU的執行方式,執行緒執行,什麼時候容易阻塞,暫存器,記憶體(可對照理解JAVA記憶體模型)等!
②,執行緒基本操作:執行緒的建立,實現,開始執行緒,掌握執行緒狀態,執行緒中斷,執行緒休眠與喚醒等!
③,掌握多執行緒常用技術:執行緒池的幾種建立方式,使用synchonize,讀寫鎖等加鎖操作,使用阻塞佇列實現順序執行,使用threadlocal實現執行緒本地變數,使用future實現非同步回撥,使用fork-join框架並行處理任務,JAVA8的並行流式處理也是不錯的選擇!
④,學會拋棄多執行緒:netty使用網路IO多路複用避免多執行緒開銷,redis使用單執行緒才能被作為分散式鎖,全域性唯一id生成的執行緒安全策略!
不是說多執行緒複雜就不用,也不是說多執行緒高效就一定用,一切根據場景來定,多執行緒開發中的實際案例,可隨時交流,更多的技術分享,敬請關注。。。
-
3 # 會點程式碼的大叔
Java的多執行緒確實是Java程式設計的難點之一,是否要學習以及如何學習,提一些建議,希望對大家有幫助。
是否要學習Java多執行緒其實這是一道送分題,建議Java程式設計師都要深入學習;
在Java開發過程中,有些技術可能很長時間都不會用到,但如果瞭解的話,在學習其他知識的時候會理解的更加深刻,比如JVM,比如多執行緒。
另外一方面,面試經常會被問到多執行緒方面的問題,特別是面試高階程式設計師,以及面試大廠的時候,多執行緒的問題出現率很高。
作為初學者來說,可以先了解,在沒有熟練掌握之前,要謹慎使用。
如何學習Java多執行緒Java多執行緒確實難,很多工作多年的程式設計師,也不敢說自己熟練掌握Java多執行緒。簡單說一下Java多執行緒需要學習的內容:
主要的知識點:如何建立執行緒;執行緒的狀態和生命週期;Java多執行緒程式設計的關鍵字,比如Volatile、synchronized等;執行緒狀態轉換;執行緒排程等等;
要了解執行緒池,做到熟練使用(自己寫不出來多執行緒,就用執行緒池);
瞭解什麼是執行緒安全,為什麼要保證執行緒安全;Java很多其他的類,都是區分執行緒安全和執行緒不安全的,比如Vector和ArrayList(並可以瞭解Concurrent併發包);
書籍的話推薦《Java併發程式設計實踐》,不過對於初學者來說,這本書比較晦澀;
推薦一個網站,大家可以跟著教程學習,免費的,還可以線上做練習:
http://how2j.cn/k/thread/thread-start/353.html
-
4 # 光聊科技
01 後端、Web
如果你學Java最終目的是想做後端、做Web的話,那鄙人認為暫時不用深入學習。畢竟要系統地學習Java還是要理解不少概念的,且得下翻不少功夫。但也還是要大概實踐一下多執行緒的一些基本的用法,面試時也很喜歡問多執行緒方面的知識 ,同時它也是作業系統的知識。程式語言是告訴計算機幹什麼和怎麼幹活的,多執行緒是為了在滿足人們實際需要的基礎上,最大限度地壓榨計算機的“剩餘價值”。
但如果你要做框架、做底層的話,那僅僅是上面說的實踐一下還是不夠的,需要用一些實際的例子練習一下。比如說做一個簡單的執行緒池、編寫一個網路程式設計的全雙工等等。
02 Android如果你學Java是為了做Android,那還是有必須稍微深入一些的。畢竟當你每啟動一個APP裡,Android系統就啟動一個UI Thread或Main Thread。Android還提供了四種操作多執行緒的方式,Handler+Thread、 AsyncTask、 ThreadPoolExecutor、IntentService。總之,在安卓裡面,你可以有很多種開啟多執行緒的姿勢。
但不管你用來做什麼,當你學買習完基本之後,都一定要再深入學習一下多執行緒,這不僅是對程式設計能力有好處,在找工作時也將受益無窮。
回覆列表
對於初學者而言,沒必要深入去學習多執行緒,而且對於Java開發而言,真正用到多執行緒程式設計的地方並不是太多,當然這也和你所做的東西有關,比如遊戲程式設計,網路通訊,這個多執行緒是少不了的,但對於MIS系統而言,多執行緒用途並不多,所以除非你工作必需剛開始沒必要深入學習多執行緒。
對於初學者,重點放在學習好基礎語法,掌握Web開發或者安卓開發的流程,學習開發過程中常用的工具和框架,說白了就是先學會怎麼用,後續在工作中不斷的豐富自己的經驗。本人從事Java開發有很多年了,也許是從事Web開發的緣故,剛開始幾乎就接觸不到多執行緒,也只要在後來的業務中才用到多執行緒的東西。
總之具體問題具體分析,技術是用來開發軟體的,軟體是為業務需要服務的,如果因為工作需要可以深入去研究,如果工作暫時不需要,可以把重心放在基礎上吧。