中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線程池的種類,區別和使用場景是什么

發布時間:2022-01-04 17:00:50 來源:億速云 閱讀:93 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關線程池的種類,區別和使用場景是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一個線程從被提交(submit)到執行共經歷以下流程:

線程池判斷核心線程池里是的線程是否都在執行任務,如果不是,則創建一個新的工作線程來執行任務。如果核心線程池里的線程都在執行任務,則進入下一個流程

線程池判斷工作隊列是否已滿。如果工作隊列沒有滿,則將新提交的任務儲存在這個工作隊列里。如果工作隊列滿了,則進入下一個流程。

線程池判斷其內部線程是否都處于工作狀態。如果沒有,則創建一個新的工作線程來執行任務。如果已滿了,則交給飽和策略來處理這個任務。

任務拒接策略?

 有4種內置的實現策略和一個用戶自定義拒絕策略。

AbortPolicy       為java線程池默認的阻塞策略,不執行此任務,而且直接拋出一個運行時異常,切記ThreadPoolExecutor.execute需要try catch,否則程序會直接退出。 

DiscardPolicy        直接拋棄,任務不執行,空方法 。

DiscardOldestPolicy   從隊 列里面拋棄head的一個任務,并再次execute 此task。

CallerRunsPolicy        在調用execute的線程里面執行此command,會阻塞入口 。 

用戶自定義拒絕策略   實現RejectedExecutionHandler,并自己定義策略模式。

再次需要注意的是,ThreadPoolExecutor.submit() 函數,此方法內部調用的execute方法,并把execute執行完后的結果給返回,但如果任務并沒有執行的話(被拒絕了),則submit返回的future.get()會一直等到。

future 內部其實還是一個runnable,并把command給封裝了下,當command執行完后,future會返回一個值。

newCachedThreadPool:

底層:返回ThreadPoolExecutor實例,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步隊列)

通俗:當有新任務到來,則插入到SynchronousQueue中,由于SynchronousQueue是同步隊列,因此會在池中尋找可用線程來執行,若有可以線程則執行,若沒有可用線程則創建一個線程來執行該任務;若池中線程空閑時間超過指定大小,則該線程會被銷毀。

適用:執行很多短期異步的小程序或者負載較輕的服務器

newFixedThreadPool:

底層:返回ThreadPoolExecutor實例,接收參數為所設定線程數量nThread,corePoolSize為nThread,maximumPoolSize為nThread;keepAliveTime為0L(不限時);unit為:TimeUnit.MILLISECONDS;WorkQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊列

通俗:創建可容納固定數量線程的池子,每隔線程的存活時間是無限的,當池子滿了就不在添加線程了;如果池中的所有線程均在繁忙狀態,對于新任務會進入阻塞隊列中(無界的阻塞隊列)

適用:執行長期的任務,性能好很多

newSingleThreadExecutor:

底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor實例,corePoolSize為1;maximumPoolSize為1;keepAliveTime為0L;unit為:TimeUnit.MILLISECONDS;workQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊列

通俗:創建只有一個線程的線程池,且線程的存活時間是無限的;當該線程正繁忙時,對于新任務會進入阻塞隊列中(無界的阻塞隊列)

適用:一個任務一個任務執行的場景

NewScheduledThreadPool:

底層:創建ScheduledThreadPoolExecutor實例,corePoolSize為傳遞來的參數,maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為0;unit為:TimeUnit.NANOSECONDS;workQueue為:new DelayedWorkQueue() 一個按超時時間升序排序的隊列

通俗:創建一個固定大小的線程池,線程池內線程存活時間無限制,線程池可以支持定時及周期性任務執行,如果所有線程均處于繁忙狀態,對于新任務會進入DelayedWorkQueue隊列中,這是一種按照超時時間排序的隊列結構

適用:周期性執行任務的場景

線程池任務執行流程:

當線程池小于corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。

當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行

當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務

當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理

當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程

當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉

關于線程池的種類,區別和使用場景是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乡县| 理塘县| 阿图什市| 沂南县| 泽普县| 香格里拉县| 八宿县| 简阳市| 运城市| 山东省| 宁蒗| 平舆县| 镇雄县| 西贡区| 女性| 灌云县| 乐山市| 尼木县| 石家庄市| 霍邱县| 马鞍山市| 望江县| 龙游县| 桐城市| 濉溪县| 吉木乃县| 博野县| 周至县| 清远市| 安阳市| 平顺县| 祁阳县| 阜城县| 化州市| 阿坝| 隆回县| 疏附县| 磐安县| 全州县| 会泽县| 汾西县|