java多線程之線程建立方式


       筆者從今天開始學習java多線程,從入門到放棄。今天咱們先記錄java多線程的建立方式。java多線程的建立方式,能夠分爲四類。繼承Thread類、實現Runnable接口、實現Callable接口經過FutureTask包裝器來建立Thread線程、使用java提供的Executors工具獲取線程池對象,從中獲取線程。

一、繼承Thread類建立線程
      Thread自己實現了runnable接口,表明一個線程的實例。繼承Thread類須要重寫父類的run方法。調用自己的start方法來開啓一個線程。start方法底層會調用run方法。這邊我寫了ExtendThread類來繼承Thread類,重寫run方法。這樣子ExtendThread就是一個線程類了。接着在測試類中調用start開啓一個線程。java

                                                                                                                        ExtendThread類多線程

                                                                                                                               開啓線程
二、實現Runnable接口
實現Runnable會比繼承Thread類來得更靈活,因java機制不容許類有多繼承性,只容許實現多個接口。因此相對於繼承Thread我仍是推薦使用這個。這邊我寫了ImplRunnable來實現Runnable接口。經過Thread構造函數傳入Runnable實現對象進去。Thread經過靜態代理方式(通俗一點講就是代理對象包裝目標對象,代理對象幫忙調用目標對象的方法,侷限性很大。如今比較流行動態代理),會去調用ImplRunnable的run方法。
以下:

                                                                                                                      實現Runnable接口

併發

開啓線程

     這裏的target,就是Runnable 的實現類也就是咱們這裏的ImplRunnable類函數

 


三、實現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:這邊比較了幾種建立線程的方式。線程

相關文章
相關標籤/搜索