線程過多就容易引發(fā)內(nèi)存溢出,因此我們有必要使用線程池的技術(shù)
降低資源消耗: 通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗
提高響應(yīng)速度: 當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等待線程創(chuàng)建就能立即執(zhí)行
提高線程管理性: 線程是稀缺資源,如果無限制的創(chuàng)建,不僅會(huì)消耗系統(tǒng)資源還會(huì)降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配、調(diào)優(yōu)和監(jiān)控
線程池的真正實(shí)現(xiàn)類是ThreadPoolExecutor,其中具有七個(gè)重要參數(shù)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueueworkQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize核心線程數(shù)。默認(rèn)情況下核心線程會(huì)一直存活,但是當(dāng)將allowsCoreThreadTimeOut設(shè)置為true時(shí),核心線程也會(huì)超時(shí)回收。核心線程最開始并不會(huì)立即創(chuàng)建而是等任務(wù)來了再創(chuàng)建,然后存活下去
maximumPoolSize大線程數(shù) 。線程池所能容納的大線程數(shù)。當(dāng)活躍線程數(shù)達(dá)到該數(shù)值后,后續(xù)的新任務(wù)將會(huì)阻塞。大線程數(shù) = 核心線程數(shù) + 非核心線程數(shù)
keepAliveTime非核心線程閑置超時(shí)時(shí)間 。如果超過該時(shí)長(zhǎng),非核心線程將會(huì)回收
unit超時(shí)單位 。指定KeepAliveTime超時(shí)時(shí)間的單位。
workQueue任務(wù)隊(duì)列 。當(dāng)核心線程全被使用的時(shí)候,且任務(wù)隊(duì)列未滿時(shí)候就會(huì)先將任務(wù)放到任務(wù)隊(duì)列中
threadFactory線程工廠 。用于指定為線程創(chuàng)建新線程的方式
handler拒絕策略 。當(dāng)大線程數(shù)達(dá)到飽和時(shí)候需要執(zhí)行的飽和策略
任務(wù)隊(duì)列任務(wù)隊(duì)列是基于阻塞隊(duì)列實(shí)現(xiàn)的,即采用生產(chǎn)者消費(fèi)者模式,在Java中需要實(shí)現(xiàn)BlockingQueue接口,但Java已經(jīng)為我們提供了7種阻塞隊(duì)列的實(shí)現(xiàn)
拒絕策略ArrayBlockingQueue
一個(gè)由數(shù)組結(jié)構(gòu)構(gòu)成的有界阻塞隊(duì)列(數(shù)組結(jié)構(gòu)可配合指針實(shí)現(xiàn)一個(gè)環(huán)形隊(duì)列)
LinkedBlockingQueue
一個(gè)由鏈表結(jié)構(gòu)構(gòu)成的有界阻塞隊(duì)列,在未指明容量時(shí)默認(rèn)為Integer.MAX_VALUE
PriorityBlockingQueue
一個(gè)支持優(yōu)先級(jí)排序的無界隊(duì)列,對(duì)元素沒有要求,可以實(shí)現(xiàn)Comparable接口來進(jìn)行比較
DelayQueue
類似于PriorityBlockingQueue,是二叉堆形成的無界優(yōu)先隊(duì)列。要求元素都實(shí)現(xiàn)DelayQueue接口,通過執(zhí)行時(shí)延從隊(duì)列中提取任務(wù),時(shí)間沒到任務(wù)取不出來
SynchronousQueue
一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,消費(fèi)者線程調(diào)用take()方法時(shí)會(huì)發(fā)生阻塞,直到有一個(gè)生產(chǎn)者生產(chǎn)了一個(gè)元素,同理生產(chǎn)者調(diào)用put()方法
LinkedBlockingDeque
使用雙向隊(duì)列實(shí)現(xiàn)的有界雙端阻塞隊(duì)列。雙端意味著可以像普通隊(duì)列一樣FIFO也可以像棧一樣FILO
LinkedTransferQueue
這是一個(gè)無界隊(duì)列
當(dāng)線程池的線程達(dá)到大線程數(shù)時(shí),需要執(zhí)行拒絕策略,拒絕策略需要實(shí)現(xiàn)RejectedExecutionHandler接口,并實(shí)現(xiàn)rejectedExcution方法,Executors為我們實(shí)現(xiàn)了4種拒絕策略
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
threadFactory);
}
單線程化線程池(newSingleThreadExecutor)特點(diǎn) : 只有核心線程,線程數(shù)量固定,全是核心線程任務(wù)隊(duì)列為鏈表的有界隊(duì)列
應(yīng)用場(chǎng)景: 控制線程大并發(fā)數(shù)
缺點(diǎn): 他的任務(wù)隊(duì)列是LinkedBlockingQueue且沒有指定容量,則當(dāng)線程數(shù)滿了之后就會(huì)一直放任務(wù)進(jìn)任務(wù)隊(duì)列,容易造成OOM
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
可緩存線程池(newCachedThreadPool)與上面類似
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
定時(shí)線程池(newScheduledThreadPool)特點(diǎn):沒有核心線程數(shù)只有非核心線程數(shù),整個(gè)線程池表現(xiàn)為線程池?cái)?shù)會(huì)根據(jù)任務(wù)量不斷增長(zhǎng),沒有增長(zhǎng),當(dāng)任務(wù)執(zhí)行完畢,空閑1分鐘后釋放線程
用途 :適合任務(wù)數(shù)比較密集,但每個(gè)任務(wù)執(zhí)行時(shí)間較短的情況
缺點(diǎn) : 如果任務(wù)多那么線程就會(huì)創(chuàng)建過多的線程,創(chuàng)建線程會(huì)很耗時(shí)并且容易導(dǎo)致OOM
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
線程池中的方法特點(diǎn): 和性能線程固定,非核心線程很多,執(zhí)行完立即刪除
應(yīng)用場(chǎng)景: 執(zhí)行定時(shí)或周期性的任務(wù)
缺點(diǎn): 線程數(shù)量上限是Integer.MAX_VALUE
void execute(Runnable command);
執(zhí)行任務(wù)
Future submit(Callable task)
提交任務(wù)task,用返回值Future獲取任務(wù)執(zhí)行結(jié)果
List
invokeAll(Collection extends Callable>tasks)
提交tasks中所有的任務(wù)
List
invokeAll(Collection extends Callable>tasks, long timeout, TimeUnit unit)
提交tasks中所有的任務(wù)帶超時(shí)時(shí)間
T invokeAny(Collection extends Callable>tasks)
提交tasks中的任務(wù)那個(gè)先執(zhí)行完畢返回該任務(wù)的結(jié)果其它任務(wù)取消
T invokeAny(Collection extends Callable>tasks,long timeout, TimeUnit unit)
提交tasks中的任務(wù)那個(gè)先執(zhí)行完畢返回該任務(wù)的結(jié)果其它任務(wù)取消帶超時(shí)時(shí)間
shutdown與shutdownnow
shutdown
線程池狀態(tài)修改為SHUTDOWN
不會(huì)接收新的任務(wù),但已提交的會(huì)執(zhí)行完, 只打斷空閑線程
shutdownnow
修改線程池狀態(tài)為stop
不接收新任務(wù)、打斷所有線程、會(huì)將隊(duì)列中的任務(wù)返回
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享文章:Java線程池理解與學(xué)習(xí)-創(chuàng)新互聯(lián)
分享URL:http://sd-ha.com/article44/eooee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、外貿(mào)建站、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、做網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容