您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java線程池的用法”,在日常操作中,相信很多人在Java線程池的用法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java線程池的用法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
ThreadPoolExecutor是Java線程池中最核心的一個(gè)類。
public interface Executor { void execute(Runnable command); } public interface ExecutorService implements Executor {} public abstract class AbstractExecutorService implements ExecutorService {} public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; } }
核心線程池的大小
線程池允許執(zhí)行的最大線程數(shù)量,當(dāng)超過這個(gè)數(shù)量后,任務(wù)將存放在workQueue中。
當(dāng)線程池中線程數(shù)量大于核心線程池大小時(shí),線程執(zhí)行完之后就會(huì)銷毀掉,直到線程池?cái)?shù)量不超過核心線程池大小。
keepAliveTime的單位,常見的有DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS
阻塞隊(duì)列,用于存儲(chǔ)等待執(zhí)行的任務(wù)。一般有以下幾種選擇
有界隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于corePoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù); 當(dāng)實(shí)際線程數(shù)大于corePoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列,當(dāng)?shù)却?duì)列滿的時(shí)候,則會(huì)在實(shí)際線程不大于maximumPoolSize的前提下創(chuàng)建新線程去處理任務(wù)。
無界任務(wù)隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于corePoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù),當(dāng)實(shí)際線程數(shù)大于corePoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列。如果創(chuàng)建速度大于處理速度,則隊(duì)列會(huì)一直增長(zhǎng),直到耗盡內(nèi)存。
直接提交的隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于maximumPoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù); 當(dāng)實(shí)際線程數(shù)大于maximumPoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列,但隊(duì)列只會(huì)保存最新提交的一個(gè)任務(wù)。
用來創(chuàng)建線程的工廠
表示拒絕處理任務(wù)的策略,有以下取值
ThreadPoolExecutor.AbortPolicy //丟棄任務(wù)并拋出RejectedExecutionException異常 ThreadPoolExecutor.DiscardPolicy //也是丟棄任務(wù),但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy //丟棄隊(duì)列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程) ThreadPoolExecutor.CallerRunsPolicy //由調(diào)用線程處理該任務(wù)
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor( 0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
無界線程池,最大線程池為Integer的最大值,線程過大時(shí)可能導(dǎo)致OOM。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor( nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
固定大小的線程池。線程數(shù)量外部傳入
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
單一線程池
到此,關(guān)于“Java線程池的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。