你真的會創建一個線程嗎?

你真的會創建一個線程嗎?

在文章開始之前先看一個問題,下圖幾種創建線程方式分別是什麼,它們之間的區別和聯繫是什麼?

你真的會創建一個線程嗎?

如果可以輕鬆回答,那麼本文對你來說過於基礎,不用往下看啦,如果還有所迷惑,那就和Nauyus一起復習下創建線程的幾種方式吧!


如何創建一個線程

Java線程類也是一個Object類,它的實例都繼承自java.lang.Thread或其子類。 可以用如下方式用java中創建一個線程:

你真的會創建一個線程嗎?

但是這樣創建的線程會快速執行結束,因為線程所執行的內容是空的,如果需要線程執行自定義的代碼, 有兩種方式可以實現,一種是繼承Thread類,覆寫run方法將線程執行內容放入run方法中,另一種是實現Runable接口,將實現Runable接口的類作為參數傳遞給Thread類。因為匿名內部類和Java8 Lambda的出現,這兩種方式又各有變體,但萬變不離其宗,下面我們來看一下。

繼承Thread類

第一種方法是繼承Thread類,用自定義的run方法覆寫父類方法實現傳遞線程執行代碼:


你真的會創建一個線程嗎?

繼承Thread類——匿名內部類寫法

對於那些只需實例化一次的代碼如果每次都需要定義一個MyThread也是挺麻煩的,這就有了匿名內部類變體:

你真的會創建一個線程嗎?

實現Runable接口

還有一種創建多線程的方法是實現Runable接口,將實現Runable接口的類作為參數傳遞給Thread類,從而做到傳遞線程要執行代碼的目的:

你真的會創建一個線程嗎?

實現Runable接口——匿名內部類

同樣,我們可以使用匿名內部類簡化代碼:

你真的會創建一個線程嗎?


實現Runable接口——Lambda表達式

好了到這裡代碼已經很簡化了,但是我們再次看下這段代碼:


你真的會創建一個線程嗎?


其實除了System.out.println("Runnable running");是我們需要執行的線程體之外其他都是模版代碼,那麼為什麼我們為了傳遞一行實際有用的代碼要把整個類傳遞進去呢? Java8提出了函數式編程思想,可以將一個函數作為參數直接傳遞給方法,並可以將函數使用Lambda表達式來簡化表達,使用Lambda表達式創建的線程如下:

你真的會創建一個線程嗎?


總結

下圖總結了創建線程的方式,當然,實際應用中我們更多的使用線程池來創建一個線程,但是也離不開這些基礎,更重要的是思想,好了關於線程池的部分我們以後文章再見。

你真的會創建一個線程嗎?

粉絲福利

最近我也根據上述的技術體系圖蒐集了幾十套阿里、頭條、螞蟻金服等公司19年的面試題,把技術點整理成了視頻(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,這裡以圖片的形式給大家展示一部分。相信它會給大家帶來很多收穫。(更全的內容和資料,在文末獲取)

Java架構進階資源

你真的會創建一個線程嗎?

分析源碼

你真的會創建一個線程嗎?

分佈式架構

你真的會創建一個線程嗎?

如何獲取

後臺私信我回復 【資料】 即可獲取,

後臺私信我回復【資料】 即可獲取,

後臺私信我回復【資料】 即可獲取



分享到:


相關文章: