1.線程池的出現
java對象佔用堆內存,操作系統線程佔用系統內存,根據jvm規範,一個線程默認最大棧大小爲1M,線程過大,會消耗很多的內存。
線程池的出現,就是爲了方便控制線程數量。
2.線程池原理
理解 線程池管理器、工作線程、任務接口、任務隊列。
線程池管理器:用於創建並管理線程池,包括線程池的創建、銷燬、添加新任務。
工作線程:線程池中的線程,在沒有任務時處於等待狀態。
任務接口:每個任務必須實現的接口(Runnable接口),以供工作線程調度任務的執行。
任務隊列: 用於存放沒有處理的任務。提供一種緩衝機制。
3.線程池線相關api
接口:Executor、ExecutorService、ScheduledExecutorService
實現類:ThreadPoolExecutor、ScheduledThreadPoolExcutor
類型 | 名稱 | 描述 |
---|---|---|
接口 | Executor | 最頂層接口,定義執行任務方法execute |
接口 | ExecutorService | 繼承Executor,擴展Callable、Future、shutdown關閉方法 |
接口 | ScheduledExecutorService | 繼承ExcutorService,擴展定時相關方法 |
實現類 | ThreadPoolExecutor | 基礎、標準的線程池實現,其他線程池都是基於此進行擴展的 |
實現類 | ScheduledThreadPoolExcutor | 繼承ThreadPoolExecutor,實現了定時任務相關的方法。 |
Executors工具類,創建線程池的工具類。這些線程池都是ThreadPoolExecutor的擴展,見名知意,不詳述。
4.合理設置線程數
如何設置合理的線程池中的線程數呢?
計算型任務:cpu數量的1-2倍。
IO型任務:相對比計算型任務,需要多一些線程,要根據具體的IO阻塞時常進行考慮,如tomcat默認最大線程:200。
也可以根據需要設置最小數量和最大數量,如db連接池。
上一篇:2.線程封閉之Threadlocal
下一篇:4.源碼中的HashMap與JUC之ConcurrentHashMap