欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用線程池的優(yōu)勢有哪些

 更新時(shí)間:2020年09月08日 14:21:10   作者:崔笑顏  
這篇文章主要介紹了Java使用線程池的優(yōu)勢有哪些,幫助大家更好的理解和掌握java池化技術(shù),感興趣的朋友可以了解下

池化技術(shù)相比大家已經(jīng)屢見不鮮了,線程池、數(shù)據(jù)庫連接池、Http 連接池等等都是對這個思想的應(yīng)用。池化技術(shù)的思想主要是為了減少每次獲取資源的消耗,提高對資源的利用率。 線程池提供了一種限制和管理資源(包括執(zhí)行一個任務(wù))。 每個線程池還維護(hù)一些基本統(tǒng)計(jì)信息,例如已完成任務(wù)的數(shù)量。

這里借用《Java 并發(fā)編程的藝術(shù)》提到的來說一下使用線程池的好處:

  1. 降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
  2. 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。
  3. 提高線程的可管理性。線程是稀缺資源,如果無限制的創(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 方法更好,除了更易管理,效率更好(用線程池實(shí)現(xiàn),節(jié)約開銷)外,還有關(guān)鍵的一點(diǎn):有助于避免 this 逃逸問題。

補(bǔ)充:this 逃逸是指在構(gòu)造函數(shù)返回之前其他線程就持有該對象的引用. 調(diào)用尚未構(gòu)造完全的對象的方法可能引發(fā)令人疑惑的錯誤。

Executor 框架不僅包括了線程池的管理,還提供了線程工廠、隊(duì)列以及拒絕策略等,Executor 框架讓并發(fā)編程變得更加簡單。

Executor 框架結(jié)構(gòu)(主要由三大部分組成)

  1. 任務(wù)(Runnable /Callable) 執(zhí)行任務(wù)需要實(shí)現(xiàn)的 Runnable 接口 或 Callable接口。Runnable 接口或 Callable 接口 實(shí)現(xiàn)類都可以被 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 執(zhí)行。
  2. 任務(wù)的執(zhí)行(Executor) 如下圖所示,包括任務(wù)執(zhí)行機(jī)制的核心接口 Executor ,以及繼承自 Executor 接口的 ExecutorService 接口。ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 這兩個關(guān)鍵類實(shí)現(xiàn)了 ExecutorService 接口。

這里提了很多底層的類關(guān)系,但是,實(shí)際上我們需要更多關(guān)注的是 ThreadPoolExecutor 這個類,這個類在我們實(shí)際使用線程池的過程中,使用頻率還是非常高的。

注意: 通過查看 ScheduledThreadPoolExecutor 源代碼我們發(fā)現(xiàn) ScheduledThreadPoolExecutor 實(shí)際上是繼承了 ThreadPoolExecutor 并實(shí)現(xiàn)了 ScheduledExecutorService ,而 ScheduledExecutorService 又實(shí)現(xiàn)了 ExecutorService,正如我們下面給出的類關(guān)系圖顯示的一樣。

ThreadPoolExecutor 類描述:

//AbstractExecutorService實(shí)現(xiàn)了ExecutorService接口
public class ThreadPoolExecutor extends AbstractExecutorService

ScheduledThreadPoolExecutor 類描述:

//ScheduledExecutorService實(shí)現(xiàn)了ExecutorService接口
public class ScheduledThreadPoolExecutor
  extends ThreadPoolExecutor
  implements ScheduledExecutorService

3) 異步計(jì)算的結(jié)果(Future) Future 接口以及 Future 接口的實(shí)現(xiàn)類 FutureTask 類都可以代表異步計(jì)算的結(jié)果。

當(dāng)我們把 Runnable接口 或 Callable 接口 的實(shí)現(xiàn)類提交給 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 執(zhí)行。(調(diào)用 submit() 方法時(shí)會返回一個 FutureTask 對象)

Executor 框架的使用示意圖

  1. 主線程首先要創(chuàng)建實(shí)現(xiàn) Runnable 或者 Callable 接口的任務(wù)對象。
  2. 把創(chuàng)建完成的實(shí)現(xiàn) Runnable/Callable接口的 對象直接交給 ExecutorService 執(zhí)行: ExecutorService.execute(Runnable command))或者也可以把 Runnable 對象或Callable 對象提交給 ExecutorService 執(zhí)行(ExecutorService.submit(Runnable task)或 ExecutorService.submit(Callable task))。
  3. 如果執(zhí)行 ExecutorService.submit(…),ExecutorService 將返回一個實(shí)現(xiàn)Future接口的對象(我們剛剛也提到過了執(zhí)行 execute()方法和 submit()方法的區(qū)別,submit()會返回一個 FutureTask 對象)。由于 FutureTask 實(shí)現(xiàn)了 Runnable,我們也可以創(chuàng)建 FutureTask,然后直接交給 ExecutorService 執(zhí)行。
  4. 最后,主線程可以執(zhí)行 FutureTask.get()方法來等待任務(wù)執(zhí)行完成。主線程也可以執(zhí)行 FutureTask.cancel(boolean mayInterruptIfRunning)來取消此任務(wù)的執(zhí)行。

以上就是Java使用線程池的優(yōu)勢有哪些的詳細(xì)內(nèi)容,更多關(guān)于Java 線程池的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot?LiteFlow引擎框架使用原理解析

    SpringBoot?LiteFlow引擎框架使用原理解析

    LiteFlow是一個輕量且強(qiáng)大的國產(chǎn)規(guī)則引擎框架,可用于復(fù)雜的組件化業(yè)務(wù)的編排領(lǐng)域,本文給大家介紹SpringBoot?LiteFlow引擎框架的相關(guān)操作,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • List集合多個復(fù)雜字段判斷去重的案例

    List集合多個復(fù)雜字段判斷去重的案例

    今天小編就為大家分享一篇關(guān)于List集合多個復(fù)雜字段判斷去重的案例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java方法簽名為何不包含返回值類型

    Java方法簽名為何不包含返回值類型

    這篇文章主要介紹了Java方法簽名為何不包含返回值類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Android內(nèi)存泄漏實(shí)戰(zhàn)解析

    Android內(nèi)存泄漏實(shí)戰(zhàn)解析

    Java是垃圾回收語言的一種。這篇文章主要介紹了Android內(nèi)存泄漏 的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Sentinel Dashboard限流規(guī)則保存方式

    Sentinel Dashboard限流規(guī)則保存方式

    這篇文章主要介紹了Sentinel Dashboard限流規(guī)則保存方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java數(shù)據(jù)機(jī)構(gòu)中關(guān)于并查集的詳解

    Java數(shù)據(jù)機(jī)構(gòu)中關(guān)于并查集的詳解

    并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問題,如果你還不了解并查集,請看接下來的文章,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09
  • 解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry:問題

    解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry

    這篇文章主要介紹了解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry:問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JavaSE的邏輯控制你了解嗎

    JavaSE的邏輯控制你了解嗎

    這篇文章主要為大家詳細(xì)介紹了JavaSE的邏輯控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java?輪詢鎖使用時(shí)遇到問題解決方案

    Java?輪詢鎖使用時(shí)遇到問題解決方案

    這篇文章主要介紹了Java?輪詢鎖使用時(shí)遇到問題解決方案,當(dāng)我們遇到死鎖之后,除了可以手動重啟程序解決之外,還可以考慮使用順序鎖和輪詢鎖,但是過程也會遇到一些問題,接下來我們一起進(jìn)入下面文章了解解決方案,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot整合OpenFeign的坑

    SpringBoot整合OpenFeign的坑

    最近試用SpringBoot+K8S,遇到了個坑,通過OpenFeign請求返回值LocalDateTime發(fā)生了異常,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下
    2021-07-07

最新評論