Java使用線程池的優(yōu)勢有哪些
池化技術(shù)相比大家已經(jīng)屢見不鮮了,線程池、數(shù)據(jù)庫連接池、Http 連接池等等都是對這個思想的應(yīng)用。池化技術(shù)的思想主要是為了減少每次獲取資源的消耗,提高對資源的利用率。 線程池提供了一種限制和管理資源(包括執(zhí)行一個任務(wù))。 每個線程池還維護(hù)一些基本統(tǒng)計信息,例如已完成任務(wù)的數(shù)量。
這里借用《Java 并發(fā)編程的藝術(shù)》提到的來說一下使用線程池的好處:
降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時,任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。 提高線程的可管理性。線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。Executor 框架
Executor 框架是 Java5 之后引進(jìn)的,在 Java 5 之后,通過 Executor 來啟動線程比使用 Thread 的 start 方法更好,除了更易管理,效率更好(用線程池實現(xiàn),節(jié)約開銷)外,還有關(guān)鍵的一點:有助于避免 this 逃逸問題。
補(bǔ)充:this 逃逸是指在構(gòu)造函數(shù)返回之前其他線程就持有該對象的引用. 調(diào)用尚未構(gòu)造完全的對象的方法可能引發(fā)令人疑惑的錯誤。
Executor 框架不僅包括了線程池的管理,還提供了線程工廠、隊列以及拒絕策略等,Executor 框架讓并發(fā)編程變得更加簡單。
Executor 框架結(jié)構(gòu)(主要由三大部分組成)
任務(wù)(Runnable /Callable) 執(zhí)行任務(wù)需要實現(xiàn)的 Runnable 接口 或 Callable接口。Runnable 接口或 Callable 接口 實現(xiàn)類都可以被 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 執(zhí)行。 任務(wù)的執(zhí)行(Executor) 如下圖所示,包括任務(wù)執(zhí)行機(jī)制的核心接口 Executor ,以及繼承自 Executor 接口的 ExecutorService 接口。ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 這兩個關(guān)鍵類實現(xiàn)了 ExecutorService 接口。這里提了很多底層的類關(guān)系,但是,實際上我們需要更多關(guān)注的是 ThreadPoolExecutor 這個類,這個類在我們實際使用線程池的過程中,使用頻率還是非常高的。
注意: 通過查看 ScheduledThreadPoolExecutor 源代碼我們發(fā)現(xiàn) ScheduledThreadPoolExecutor 實際上是繼承了 ThreadPoolExecutor 并實現(xiàn)了 ScheduledExecutorService ,而 ScheduledExecutorService 又實現(xiàn)了 ExecutorService,正如我們下面給出的類關(guān)系圖顯示的一樣。
ThreadPoolExecutor 類描述:
//AbstractExecutorService實現(xiàn)了ExecutorService接口public class ThreadPoolExecutor extends AbstractExecutorService
ScheduledThreadPoolExecutor 類描述:
//ScheduledExecutorService實現(xiàn)了ExecutorService接口public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService
3) 異步計算的結(jié)果(Future) Future 接口以及 Future 接口的實現(xiàn)類 FutureTask 類都可以代表異步計算的結(jié)果。
當(dāng)我們把 Runnable接口 或 Callable 接口 的實現(xiàn)類提交給 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 執(zhí)行。(調(diào)用 submit() 方法時會返回一個 FutureTask 對象)
Executor 框架的使用示意圖
以上就是Java使用線程池的優(yōu)勢有哪些的詳細(xì)內(nèi)容,更多關(guān)于Java 線程池的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python excel和yaml文件的讀取封裝2. python如何實現(xiàn)word批量轉(zhuǎn)HTML3. python3實現(xiàn)往mysql中插入datetime類型的數(shù)據(jù)4. moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決5. python爬蟲實戰(zhàn)之制作屬于自己的一個IP代理模塊6. Android中的緩存7. Docker鏡像管理常用操作代碼示例8. 關(guān)于 Android WebView 的內(nèi)存泄露問題9. java——Byte類/包裝類的使用說明10. Spring boot整合連接池實現(xiàn)過程圖解
