1. 程式人生 > >IT題庫9-線程池的概念和原理

IT題庫9-線程池的概念和原理

attach order 添加 left chm str 線程處理 處理過程 如果

在什麽情況下使用線程池?
1.單個任務處理的時間比較短;
2.需要處理的任務的數量大;

使用線程池的好處:
1.減少在創建和銷毀線程上所花的時間以及系統資源的開銷。
2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。

線程池的概念和原理

線程池是一種多線程處理方法,處理過程中將任務添加到隊列,然後在創建線程後自動啟動這些任務。線程池線程都是後臺線程,每個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。如果某個線程處於空閑狀態,則線程池將會調度一個任務給它,.如果所有線程都始終保持繁忙,但將任務放入到一個隊列中,則線程池將在一段時間後創建另一個輔助線程,但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啟動

一般一個簡單線程池至少包含下列組成部分。

1. 線程池管理器(ThreadPoolManager):用於創建並管理線程池

2. 工作線程(WorkThread): 線程池中線程

3. 任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行。

4. 任務隊列:用於存放沒有處理的任務。提供一種緩沖機制。

JDK自帶線程池總類介紹介紹:
Java裏面線程池的頂級接口是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池接口是ExecutorService。下面這張圖完整描述了線程池的類體系結構。

技術分享圖片

標記一下比較重要的類:

ExecutorService: 真正的線程池接口。
ScheduledExecutorService 能和Timer/TimerTask類似,解決那些需要任務重復執行的問題。
ThreadPoolExecutor ExecutorService的默認實現。
ScheduledThreadPoolExecutor 繼承ThreadPoolExecutor的ScheduledExecutorService接口實現,周期性任務調度的類實現。

1、newFixedThreadPool創建一個指定工作線程數量的線程池。每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。
2、newCachedThreadPool創建一個可緩存的線程池。這種類型的線程池特點是:
1).工作線程的創建數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。
2).如果長時間沒有往線程池中提交任務,即如果工作線程空閑了指定的時間(默認為1分鐘),則該工作線程將自動終止。終止後,如果你又提交了新的任務,則線程池重新創建一個工作線程。
3、newSingleThreadExecutor創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,如果這個線程異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。單工作線程最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的 。
4、newScheduleThreadPool創建一個定長的線程池,而且支持定時的以及周期性的任務執行,類似於Timer。(這種線程池原理暫還沒完全了解透徹)

總結:

一.FixedThreadPool是一個典型且優秀的線程池,它具有線程池提高程序效率和節省創建線程時所耗的開銷的優點。但是,在線程池空閑時,即線程池中沒有可運行任務時,它不會釋放工作線程,還會占用一定的系統資源。

二.CachedThreadPool的特點就是在線程池空閑時,即線程池中沒有可運行任務時,它會釋放工作線程,從而釋放工作線程所占用的資源。但是,但當出現新任務時,又要創建一新的工作線程,又要一定的系統開銷。並且,在使用CachedThreadPool時,一定要註意控制任務的數量,否則,由於大量線程同時運行,很有會造成系統癱瘓。

三.SingleThreadExecutor 創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,如果這個線程異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。

四.ScheduleThreadPool 創建一個定長的線程池,而且支持定時的以及周期性的任務執行,類似於Timer。

IT題庫9-線程池的概念和原理