Java創(chuàng)建線程池的方式
一、創(chuàng)建線程池的方式一般有兩種:
通過(guò)Executors工廠方法創(chuàng)建
通過(guò)?
newThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue,new?ThreadFactoryBuilder().setNameFormat("thread-name-%").build(),?newThreadPoolExecutor.AbortPolicy())
1. Executors.newSingleThreadExecutor()
這個(gè)線程池只有一個(gè)核心線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來(lái)替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。
publicstaticExecutorService newSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService(newThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>()));}
corePoolSize:1,只有一個(gè)核心線程在工作
maximumPoolSize:1
keepAliveTime:0L
TimeUnit:?
TimeUnit.MILLISECONDS?時(shí)間單位是毫秒workQueue:new LinkedBlockingQueue(),其緩沖隊(duì)列是無(wú)界的
2. Executors.newFixedThreadPool(n)
FixedThreadPool 是固定大小的線程池,只有核心線程。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。FixedThreadPool 多數(shù)針對(duì)一些很穩(wěn)定很固定的正規(guī)并發(fā)線程,多用于服務(wù)器。
publicstaticExecutorService newFixedThreadPool(int nThreads){returnnewThreadPoolExecutor(nThreads, nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>());}
corePoolSize:nThreads
maximumPoolSize:nThreads
keepAliveTime:0L
TimeUnit:?
TimeUnit.MILLISECONDS?時(shí)間單位是毫秒workQueue:new LinkedBlockingQueue(),其緩沖隊(duì)列是無(wú)界的
3. Executors.newCachedThreadPool()
CachedThreadPool 是無(wú)界線程池,如果線程池的大小超過(guò)了處理任務(wù)所需要的線程,那么就會(huì)回收部分空閑(60 秒不執(zhí)行任務(wù))線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來(lái)處理任務(wù)。線程池大小完全依賴于操作系統(tǒng)(或者說(shuō) JVM)能夠創(chuàng)建的最大線程大小。SynchronousQueue 是一個(gè)是緩沖區(qū)為 1 的阻塞隊(duì)列。緩存型池子通常用于執(zhí)行一些生存期很短的異步型任務(wù),因此在一些面向連接的 daemon 型 SERVER 中用得不多。但對(duì)于生存期短的異步任務(wù),它是 Executor 的首選。
publicstaticExecutorService newCachedThreadPool(){returnnewThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,newSynchronousQueue<Runnable>());}
corePoolSize:0
maximumPoolSize:Integer.MAX_VALUE
keepAliveTime:60L
TimeUnit:?
TimeUnit.SECONDS時(shí)間單位是秒workQueue:new SynchronousQueue(),一個(gè)是緩沖區(qū)為 1 的阻塞隊(duì)列。
4. Executors.newScheduledThreadPool(n)
ScheduledThreadPool核心線程池固定,大小無(wú)限的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。創(chuàng)建一個(gè)周期性執(zhí)行任務(wù)的線程池。如果閑置,非核心線程池會(huì)在 DEFAULT_KEEPALIVEMILLIS 時(shí)間內(nèi)回收。
publicScheduledThreadPoolExecutor(int corePoolSize){super(corePoolSize,Integer.MAX_VALUE,0, NANOSECONDS,newDelayedWorkQueue());}
corePoolSize:corePoolSize
maximumPoolSize:Integer.MAX_VALUE
keepAliveTime:DEFAULTKEEPALIVEMILLIS
workQueue:new DelayedWorkQueue()
具體的詳情請(qǐng)看之前的文章線程池的理解以及使用
本文作者:Java技術(shù)債務(wù)
Java技術(shù)債務(wù)
原文鏈接:https://www.cuizb.top/myblog/article/1646793688
版權(quán)聲明:?本博客所有文章除特別聲明外,均采用 CC BY 3.0 CN協(xié)議進(jìn)行許可。轉(zhuǎn)載請(qǐng)署名作者且注明文章出處。

JVM內(nèi)存泄漏和內(nèi)存溢出的原因
JVM常用監(jiān)控工具解釋以及使用
ClickHouse之MaterializeMySQL引擎(十)
三種實(shí)現(xiàn)分布式鎖的實(shí)現(xiàn)與區(qū)別
認(rèn)同就點(diǎn)贊
支持就在看
一鍵四連,你的offer也四連
