Java 并发总结——线程池
一、線程池
在程序啟動的時候就創(chuàng)建若干線程來響應(yīng)處理,它們被稱為線程池,里面的線程叫工作線程
(1)線程池的作用
1、降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
2、提高響應(yīng)速度。當任務(wù)到達時,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。
3、提高線程的可管理性。
(2)常用線程池
ExecutorService 是主要的實現(xiàn)類
1、newSingleThreadExecutor
創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù), 保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行
適用場景:任務(wù)少 ,并且不需要并發(fā)執(zhí)行
2、newCachedThreadPool
創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程.
適用場景:處理任務(wù)速度 > 提交任務(wù)速度,耗時少的任務(wù)(避免無限新增線程)
3、newFixedThreadPool
創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。
4、newScheduledThreadPool
創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行
(3)ThreadPoolExecutor構(gòu)造方法參數(shù)說明
1、corePoolSize
核心線程數(shù),默認情況下核心線程會一直存活,即使處于閑置狀態(tài)也不會受存keepAliveTime限制。除非將allowCoreThreadTimeOut設(shè)置為true。
2、maximumPoolSize
線程池所能容納的最大線程數(shù)。超過這個數(shù)的線程將被阻塞。當任務(wù)隊列為沒有設(shè)置大小的LinkedBlockingDeque時,這個值無效。
3、keepAliveTime
非核心線程的閑置超時時間,超過這個時間就會被回收。
4、unit
指定keepAliveTime的單位,如TimeUnit.SECONDS。當將allowCoreThreadTimeOut設(shè)置為true時對corePoolSize生效。
5、workQueue
線程池中的任務(wù)隊列,常用的有三種隊列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue。
6、threadFactory
線程工廠,提供創(chuàng)建新線程的功能。ThreadFactory是一個接口,只有一個方法
(4)線程池原理
1、當前池大小 poolSize 小于 corePoolSize ,則創(chuàng)建新線程執(zhí)行任務(wù)。
2、當前池大小 poolSize 大于 corePoolSize ,且等待隊列未滿,則進入等待隊列
3、當前池大小 poolSize 大于 corePoolSize 且小于 maximumPoolSize ,且等待隊列已滿,則創(chuàng)建新線程執(zhí)行任務(wù)。
4、當前池大小 poolSize 大于 corePoolSize 且大于 maximumPoolSize ,且等待隊列已滿,則調(diào)用拒絕策略來處理該任務(wù)。
線程池里的每個線程執(zhí)行完任務(wù)后不會立刻退出,而是會去檢查下等待隊列里是否還有線程任務(wù)需要執(zhí)行,如果在 keepAliveTime 里等不到新的任務(wù)了,那么線程就會退出。
(5)Executor拒絕策略
1、AbortPolicy
為java線程池默認的阻塞策略,不執(zhí)行此任務(wù),而且直接拋出一個運行時異常,切記ThreadPoolExecutor.execute需要try catch,否則程序會直接退出.
2、DiscardPolicy
直接拋棄,任務(wù)不執(zhí)行,空方法
3、DiscardOldestPolicy
從隊列里面拋棄head的一個任務(wù),并再次execute 此task。
4、CallerRunsPolicy
在調(diào)用execute的線程里面執(zhí)行此command,會阻塞入
用戶自定義拒絕策略:實現(xiàn)RejectedExecutionHandler,并自己定義策略模式
總結(jié)
以上是生活随笔為你收集整理的Java 并发总结——线程池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台式电脑酷睿i3和i5的区别有哪些 哪个
- 下一篇: Java 并发总结——进程与线程