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

java高級應用:線程池的全面講解(干貨)

 更新時間:2021年02月27日 11:17:08   作者:Java技術棧  
這篇文章主要介紹了java高級應用:線程池的全面講解(干貨),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

什么是線程池?

很簡單,簡單看名字就知道是裝有線程的池子,我們可以把要執(zhí)行的多線程交給線程池來處理,和連接池的概念一樣,通過維護一定數量的線程池來達到多個線程的復用。

線程池的好處

我們知道不用線程池的話,每個線程都要通過new Thread(xxRunnable).start()的方式來創(chuàng)建并運行一個線程,線程少的話這不會是問題,而真實環(huán)境可能會開啟多個線程讓系統(tǒng)和程序達到最佳效率,當線程數達到一定數量就會耗盡系統(tǒng)的CPU和內存資源,也會造成GC頻繁收集和停頓,因為每次創(chuàng)建和銷毀一個線程都是要消耗系統(tǒng)資源的,如果為每個任務都創(chuàng)建線程這無疑是一個很大的性能瓶頸。

所以,線程池中的線程復用極大節(jié)省了系統(tǒng)資源,當線程一段時間不再有任務處理時它也會自動銷毀,而不會長駐內存。

線程池核心類

在java.util.concurrent包中我們能找到線程池的定義,其中ThreadPoolExecutor是我們線程池核心類,首先看看線程池類的主要參數有哪些。

corePoolSize:線程池的核心大小,也可以理解為最小的線程池大小。

maximumPoolSize:最大線程池大小。

keepAliveTime:空余線程存活時間,指的是超過corePoolSize的空余線程達到多長時間才進行銷毀。

unit:銷毀時間單位。

workQueue:存儲等待執(zhí)行線程的工作隊列。

threadFactory:創(chuàng)建線程的工廠,一般用默認即可。

handler:拒絕策略,當工作隊列、線程池全已滿時如何拒絕新任務,默認拋出異常。

線程池工作流程

1、如果線程池中的線程小于corePoolSize時就會創(chuàng)建新線程直接執(zhí)行任務。

2、如果線程池中的線程大于corePoolSize時就會暫時把任務存儲到工作隊列workQueue中等待執(zhí)行。

3、如果工作隊列workQueue也滿時:當線程數小于最大線程池數maximumPoolSize時就會創(chuàng)建新線程來處理,而線程數大于等于最大線程池數maximumPoolSize時就會執(zhí)行拒絕策略。

線程池分類

Executors是jdk里面提供的創(chuàng)建線程池的工廠類,它默認提供了4種常用的線程池應用,而不必我們去重復構造。

newFixedThreadPool

固定線程池,核心線程數和最大線程數固定相等,而空閑存活時間為0毫秒,說明此參數也無意義,工作隊列為最大為Integer.MAX_VALUE大小的阻塞隊列。當執(zhí)行任務時,如果線程都很忙,就會丟到工作隊列等有空閑線程時再執(zhí)行,隊列滿就執(zhí)行默認的拒絕策略。

newCachedThreadPool

帶緩沖線程池,從構造看核心線程數為0,最大線程數為Integer最大值大小,超過0個的空閑線程在60秒后銷毀,SynchronousQueue這是一個直接提交的隊列,意味著每個新任務都會有線程來執(zhí)行,如果線程池有可用線程則執(zhí)行任務,沒有的話就創(chuàng)建一個來執(zhí)行,線程池中的線程數不確定,一般建議執(zhí)行速度較快較小的線程,不然這個最大線程池邊界過大容易造成內存溢出。

newSingleThreadExecutor

單線程線程池,核心線程數和最大線程數均為1,空閑線程存活0毫秒同樣無意思,意味著每次只執(zhí)行一個線程,多余的先存儲到工作隊列,一個一個執(zhí)行,保證了線程的順序執(zhí)行。

newScheduledThreadPool

調度線程池,即按一定的周期執(zhí)行任務,即定時任務,對ThreadPoolExecutor進行了包裝而已。

拒絕策略

AbortPolicy

簡單粗暴,直接拋出拒絕異常,這也是默認的拒絕策略。

CallerRunsPolicy

如果線程池未關閉,則會在調用者線程中直接執(zhí)行新任務,這會導致主線程提交線程性能變慢。

DiscardPolicy

從方法看沒做任務操作,即表示不處理新任務,即丟棄。

DiscardOldestPolicy

拋棄最老的任務,就是從隊列取出最老的任務然后放入新的任務進行執(zhí)行。

如何提交線程

如可以先隨便定義一個固定大小的線程池

ExecutorService es = Executors.newFixedThreadPool(3);

提交一個線程

es.submit(xxRunnble);
es.execute(xxRunnble);

submit和execute分別有什么區(qū)別呢?

execute沒有返回值,如果不需要知道線程的結果就使用execute方法,性能會好很多。

submit返回一個Future對象,如果想知道線程結果就使用submit提交,而且它能在主線程中通過Future的get方法捕獲線程中的異常。

如何關閉線程池

es.shutdown();

不再接受新的任務,之前提交的任務等執(zhí)行結束再關閉線程池。

es.shutdownNow();

不再接受新的任務,試圖停止池中的任務再關閉線程池,返回所有未處理的線程list列表。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • Java中單例模式的七種寫法示例

    Java中單例模式的七種寫法示例

    作為一個Java開發(fā)者,也許你覺得自己對單例模式的了解已經足夠多了,但究竟你自己了解的程度到底怎樣呢?下面這篇文章主要給大家介紹了關于Java中單例模式的七種寫法,需要的朋友可以參考下
    2021-09-09
  • Java?Stream排序的實現方式面試精講

    Java?Stream排序的實現方式面試精講

    這篇文章主要為大家介紹了Java?Stream排序的實現方式面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java中unsafe操作實例總結

    Java中unsafe操作實例總結

    本篇文章給大家分享了關于Java中unsafe操作的相關知識點以及相關的實例代碼,有需要的朋友可以學習參考下。
    2018-03-03
  • 詳解Java的Hibernate框架中的Interceptor和Collection

    詳解Java的Hibernate框架中的Interceptor和Collection

    這篇文章主要介紹了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • Java實現Excel表單控件的添加與刪除

    Java實現Excel表單控件的添加與刪除

    本文通過Java代碼示例介紹如何在Excel表格中添加表單控件,包括文本框、單選按鈕、復選框、組合框、微調按鈕等,以及如何刪除Excel中的指定表單控件,需要的可以參考一下
    2022-05-05
  • 聊聊Spring Boot 如何集成多個 Kafka

    聊聊Spring Boot 如何集成多個 Kafka

    這篇文章主要介紹了Spring Boot 集成多個 Kafka的相關資料,包括配置文件,生成者和消費者配置過程,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-10-10
  • Springboot實現定時任務的4種方式舉例詳解

    Springboot實現定時任務的4種方式舉例詳解

    在我們開發(fā)項目過程中經常需要定時任務來幫助我們來做一些內容,下面這篇文章主要給大家介紹了關于Springboot實現定時任務的4種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • java反射如何獲取方法屬性和方法調用

    java反射如何獲取方法屬性和方法調用

    這篇文章主要介紹了java反射如何獲取方法屬性和方法調用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring集成MyBatis?及Aop分頁的實現代碼

    Spring集成MyBatis?及Aop分頁的實現代碼

    這篇文章主要介紹了Spring集成MyBatis?及Aop分頁的實現,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 當面試官問我ArrayList和LinkedList哪個更占空間時,我是這么答的(面試官必問)

    當面試官問我ArrayList和LinkedList哪個更占空間時,我是這么答的(面試官必問)

    今天介紹一下Java的兩個集合類,ArrayList和LinkedList,這兩個集合的知識點幾乎可以說面試必問的。感興趣的朋友跟隨小編一起看看吧
    2020-08-08

最新評論