首頁>Club>
11
回覆列表
  • 1 # 影片搞笑合集1

    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兩個狀態分離出來。

    總結

    以上就是多執行緒的一些基礎概念,可能總結的不夠仔細,多多包涵。後續會針對一些比較重要的知識點單獨列出來總結。學好多執行緒是拿高薪的基礎,小夥伴一起加油吧!

  • 2 # 街角下的螞蟻

    https://mp.weixin.qq.com/s/tARNEFmLnxeqSTjhojs8tQ,可以看看這篇執行緒池的講解,詳細說明了執行緒池的建立以及執行緒複用原理

  • 中秋節和大豐收的關聯?
  • 魯濱孫漂流記讀後感,開頭,結尾?