線程池總結

一.常用概念:

1.Executor(執行器):

    (1)它是一個任務執行的頂層接口,裏面只有一個execute方法,傳遞參數爲一個Runnable

    (2)調用Runnable的run方法相當於方法調用,調用start方法是將Runnable(相當於一項任務)交給一個線程去處理

2.ExecutorService(執行器服務):

    (1)繼承自Executor,所以也包含了execute方法

    (2)它等待接收任務

    (3)它裏面的submit方法,可以接收Runnable,Callable倆種類型,返回一個Future類型

3.Executors:是一個工具類,裏面提供了很多的靜態方法,主要是操作Executor

4.Callable:

    (1)它是一個接口,類似於Runnable,實現了Callable接口,必須重新它的call方法

    (2)call方法是有返回值的,類型爲泛型,run方法沒有返回值

5.Future:

    (1)它是call方法的返回值

    (2)FutureTask內部包裝了一個任務,類型爲一個Callable,它是一個泛型類,表示未來我這個任務執

    行完是會返回一個泛型類型的值,同時FutureTask需要交給一個線程去運行,它的get方法是一個

    阻塞方法,一直等到任務執行完成

    (2)ExecutorService的submit可以扔Callable,它返回的結果放到了Future裏面,就不需要FutureTask,

    它裏面new了一個FutureTask了,所以我們直接將結果放入到Future,Future的get方法也是一個阻塞方法,

    一直等到任務執行完成,isDone判斷任務是否執行完,沒有get的時候爲false,因爲任務還沒有執行完、

二.ThreadPool(線程池):

    1.所有的線程池都實現了ExecutorService接口

    2.線程池中維護的隊列一般是阻塞隊列(blockingqueue)

    3.優點爲任務執行完,線程不會消失,它會進入空閒狀態(idel),當有新任務來了,由空閒狀態線程繼續執行,

    不需要重新創建線程

    4.內部構成:在池中維護着很多線程,等待執行任務;同時維護着一個任務隊列(還沒有被執行的任務)和一個

    結束的任務隊列(任務結束後放入這個隊列)

    5.線程池中的線程執行完任務後,其狀態變爲idel狀態

    6.線程池狀態:

            (1)Running:在線程池創建時處於的狀態

            (2)Shutdown:在線程池調用shutdown方法(關閉線程池)時處於的狀態,它會在所有任務執行完成後才

            真正關閉,如果還有任務未完成它的狀態爲Shutting(正在關閉)

            (3)Stop:在線程池調用了shutdownNow方法處於的狀態,它會立即關閉線程池,即使有任務還沒有執行完它也不會等待

            (4)Tidying:如果我們是處於Shutdown狀態,只有當我們的任務隊列爲空同時執行的任務也爲空時進入這個狀態,

            如果我們是處於stop狀態,當我們執行的任務未空時進入這個狀態

            (5)terminated:當線程池徹底終止時進入該狀態

    7.線程池包含的內容有:線程池狀態,線程池的大小,線程池中活躍的線程數量,任務隊列中剩餘的任務數,已經完成的任務數

    8.幾個判斷線程池狀態的方法:

            (1)isTerminated 判斷任務是否完成

            (2)isShutdown 線程池是否關閉

三.線程池種類:

    1.newFixedThreadPool:

            (1)定義:固定個數的線程池

            (2)原理:如果我們的任務很多,那個線程先執行完任務即處於空閒狀態,就去任務隊列再次領取任務執行,

            不會創建新的線程

            (3)創建方式:ExecutorService service=Executors.newCachedThreadPool();

    2.newCachedThreadPool:

            (1)定義:緩存的線程池

            (2)原理:一開始線程池中沒有線程,當來了一個任務,如果我們的線程池中沒有處於空閒狀態的線程,

            我們就創建一個新線程,如果有空閒的線程就由空閒的線程去執行我們的新任務

            (3)生命週期:線程池中的每一個線程都有一個生存週期,默認情況下,如果空閒時間超過60秒回會被自動銷燬

            (4)創建方式:ExecutorService service=Executors.newCachedThreadPool()

    3.newScheduledThreadPool:

            (1)定義:定時執行的線程池

            (2)它主要是用來取代timer的,原因爲timer每次都會起一個新的線程,但newScheduledThreadPool線程是可重用的

            (3)主要作用:以固定的頻率執行某個任務

            (4)創建方式:ScheduledExecutorService service=Executors.newScheduledThreadPool(4)

    4.newSingleThreadExecutor

            (1)定義:單線程線程池,池裏只有一個線程

            (2)ExecutorService service=Executors.newSingleThreadExecutor()

            (3)主要作用:保證任務前後順序執行,先扔的任務先執行,第一個執行完其它的任務纔可以繼續執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章