1. 程式人生 > >java多執行緒之執行緒建立方式

java多執行緒之執行緒建立方式


       筆者從今天開始學習java多執行緒,從入門到放棄。今天我們先記錄java多執行緒的建立方式。java多執行緒的建立方式,可以分為四類。繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來建立Thread執行緒、使用java提供的Executors工具獲取執行緒池物件,從中獲取執行緒。

1、繼承Thread類建立執行緒
      Thread本身實現了runnable介面,代表一個執行緒的例項。繼承Thread類需要重寫父類的run方法。呼叫本身的start方法來開啟一個執行緒。start方法底層會呼叫run方法。這邊我寫了ExtendThread類來繼承Thread類,重寫run方法。這樣子ExtendThread就是一個執行緒類了。接著在測試類中呼叫start開啟一個執行緒。

                                                                                                                        ExtendThread類

                                                                                                                               開啟執行緒


2、實現Runnable介面
實現Runnable會比繼承Thread類來得更靈活,因java機制不允許類有多繼承性,只允許實現多個介面。所以相對於繼承Thread我還是推薦使用這個。這邊我寫了ImplRunnable來實現Runnable介面。通過Thread建構函式傳入Runnable實現物件進去。Thread通過靜態代理方式(通俗一點講就是代理物件包裝目標物件,代理物件幫忙呼叫目標物件的方法,侷限性很大。現在比較流行動態代理),會去呼叫ImplRunnable的run方法。
如下:

                                                                                                                      實現Runnable介面

開啟執行緒

     這裡的target,就是Runnable 的實現類也就是我們這裡的ImplRunnable類

 


3、實現Callable介面通過FutureTask包裝器來建立Thread執行緒
        有時候我們需要檢測當前執行緒的執行情況,並根據情況對其進行停止,這時候就可以通過包裝器FutureTask來解決這個問題。首先我們建立ImplCallable類實現Callable介面傳入一個返回值型別String。重寫call方法,返回String型別的結果。後面通過包裝器可以獲取該結果

 

                                                                                ImplCallable類實現了Callable介面

        這裡我們來看下FutureTask包裝器的結構圖:FutureTask間接實現了Runnable和Future介面,可以對Runnabl進行包裝。進行監測等功能擴充套件。

                                                                                         FutureTask包裝器的結構圖
                       
       呼叫FutureTask對Callable實現類進行包裝。FutureTask能夠對當前這個執行緒進行監測,比如futureTask.cancel取消執行緒任務,futureTask.get獲取執行緒返回的結果,此結果就是剛剛我們重寫call方法裡面的返回值,呼叫get方法執行緒會進入阻塞狀態 。futureTask.isDone()可以判斷當前執行緒是否執行完成。


4.通過執行緒池來建立執行緒。
        從上面來看,我們想要一個執行緒就去建立一個執行緒,這也實現起來很方便,可是事實上,如果併發數執行緒變多了,並且每個執行緒執行時間比較短,這樣就會頻繁的去建立執行緒資源就會大大降低了系統的效能。通常,我們可以用執行緒池來解決這個問題,首先,在服務啟動的時候,我們可以啟動好幾個執行緒,並用一個容器(如執行緒池)來管理這些執行緒。
        java提供了Executors工具來給開發者建立不同型別的執行緒池,這裡我們簡單講newFixedThreadPool這個方法。(後續我們會深入學習執行緒池的實現原理。)newFixedThreadPool方法建立了固定容量的執行緒池這裡我初始化10個。


       呼叫execute執行某個執行緒,傳入Runnable的實現類。(筆者現在也是剛接觸執行緒池不久,不能夠深入去記錄一些東西。後續會不斷的累計並分析給大家。)
ps:這邊比較了幾種建立執行緒的方式。