回覆列表
-
1 # 影片搞笑合集1
-
2 # 街角下的螞蟻
https://mp.weixin.qq.com/s/tARNEFmLnxeqSTjhojs8tQ,可以看看這篇執行緒池的講解,詳細說明了執行緒池的建立以及執行緒複用原理
https://mp.weixin.qq.com/s/tARNEFmLnxeqSTjhojs8tQ,可以看看這篇執行緒池的講解,詳細說明了執行緒池的建立以及執行緒複用原理
Java多執行緒系列——Java多執行緒基礎
前言
多執行緒併發程式設計是Java程式設計中重要的一塊內容,也是面試重點覆蓋區域,所以學好多執行緒併發程式設計對我們來說極其重要,下面跟我一起開啟本次的學習之旅吧。
正文
執行緒與程序
1 執行緒:程序中負責程式執行的執行單元 執行緒本身依靠程式進行執行 執行緒是程式中的順序控制流,只能使用分配給程式的資源和環境
2 程序:執行中的程式 一個程序至少包含一個執行緒
3 單執行緒:程式中只存在一個執行緒,實際上主方法就是一個主執行緒
4 多執行緒:在一個程式中執行多個任務 目的是更好地使用CPU資源
執行緒的實現
1 繼承Thread類
在java.lang包中定義, 繼承Thread類必須重寫run()方法
建立好了自己的執行緒類之後,就可以建立執行緒物件了,然後透過start()方法去啟動執行緒。注意,不是呼叫run()方法啟動執行緒,run方法中只是定義需要執行的任務,如果呼叫run方法,即相當於在主執行緒中執行run方法,跟普通的方法呼叫沒有任何區別,此時並不會建立一個新的執行緒來執行定義的任務。
在上面程式碼中,透過呼叫start()方法,就會建立一個新的執行緒了。為了分清start()方法呼叫和run()方法呼叫的區別,請看下面一個例子:
執行結果:
從輸出結果可以得出以下結論: 1)thread1和thread2的執行緒ID不同,thread2和主執行緒ID相同,說明透過run方法呼叫並不會建立新的執行緒,而是在主執行緒中直接執行run方法,跟普通的方法呼叫沒有任何區別; 2)雖然thread1的start方法呼叫在thread2的run方法前面呼叫,但是先輸出的是thread2的run方法呼叫的相關資訊,說明新執行緒建立的過程不會阻塞主執行緒的後續執行。
2 實現Runnable介面
在Java中建立執行緒除了繼承Thread類之外,還可以透過實現Runnable介面來實現類似的功能。實現Runnable介面必須重寫其run方法。 下面是一個例子:
Runnable的中文意思是“任務”,顧名思義,透過實現Runnable介面,我們定義了一個子任務,然後將子任務交由Thread去執行。注意,這種方式必須將Runnable作為Thread類的引數,然後透過Thread的start方法來建立一個新執行緒來執行該子任務。如果呼叫Runnable的run方法的話,是不會建立新執行緒的,這根普通的方法呼叫沒有任何區別。 事實上,檢視Thread類的實現原始碼會發現Thread類是實現了Runnable介面的。 在Java中,這2種方式都可以用來建立執行緒去執行子任務,具體選擇哪一種方式要看自己的需求。直接繼承Thread類的話,可能比實現Runnable介面看起來更加簡潔,但是由於Java只允許單繼承,所以如果自定義類需要繼承其他類,則只能選擇實現Runnable介面。
執行緒的狀態
在正式學習Thread類中的具體方法之前,我們先來了解一下執行緒有哪些狀態,這個將會有助於後面對Thread類中的方法的理解。
建立(new)狀態: 準備好了一個多執行緒的物件 就緒(runnable)狀態: 呼叫了start()方法, 等待CPU進行排程
執行(running)狀態: 執行run()方法
阻塞(blocked)狀態: 暫時停止執行, 可能將資源交給其它執行緒使用
終止(dead)狀態: 執行緒銷燬
當需要新起一個執行緒來執行某個子任務時,就建立了一個執行緒。但是執行緒建立之後,不會立即進入就緒狀態,因為執行緒的執行需要一些條件(比如記憶體資源,在前面的JVM記憶體區域劃分一篇博文中知道程式計數器、Java棧、本地方法棧都是執行緒私有的,所以需要為執行緒分配一定的記憶體空間),只有執行緒執行需要的所有條件滿足了,才進入就緒狀態。 當執行緒進入就緒狀態後,不代表立刻就能獲取CPU執行時間,也許此時CPU正在執行其他的事情,因此它要等待。當得到CPU執行時間之後,執行緒便真正進入執行狀態。 執行緒在執行狀態過程中,可能有多個原因導致當前執行緒不繼續執行下去,比如使用者主動讓執行緒睡眠(睡眠一定的時間之後再重新執行)、使用者主動讓執行緒等待,或者被同步塊給阻塞,此時就對應著多個狀態:time waiting(睡眠或等待一定的事件)、waiting(等待被喚醒)、blocked(阻塞)。 當由於突然中斷或者子任務執行完畢,執行緒就會被消亡。 下面這副圖描述了執行緒從建立到消亡之間的狀態:
在有些教程上將blocked、waiting、time waiting統稱為阻塞狀態,這個也是可以的,只不過這裡我想將執行緒的狀態和Java中的方法呼叫聯絡起來,所以將waiting和time waiting兩個狀態分離出來。
總結
以上就是多執行緒的一些基礎概念,可能總結的不夠仔細,多多包涵。後續會針對一些比較重要的知識點單獨列出來總結。學好多執行緒是拿高薪的基礎,小夥伴一起加油吧!