您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Java中線程池的作用有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
1.簡(jiǎn)介
使用線程池可以避免線程的頻繁創(chuàng)建以及銷毀。
JAVA中提供的用于實(shí)現(xiàn)線程池的API:
Executor、ExecutorService、AbstractExecutorService、ThreadPoolExecutor、ForkJoinPool都位于java.util.concurrent包下。
*ThreadPoolExecutor、ForkJoinPool為線程池的實(shí)現(xiàn)類。
2.Executor
public interface Executor { /** * 向線程池提交一個(gè)任務(wù),交由線程池去執(zhí)行 */ void execute(Runnable command); }
*該接口聲明了execute(Runnable command)方法,負(fù)責(zé)向線程池中提交一個(gè)任務(wù)。
3.ExecutorService接口
public interface ExecutorService extends Executor { /** * 關(guān)閉線程池(等待隊(duì)列中的任務(wù)被執(zhí)行完畢) */ void shutdown(); /** * 立刻關(guān)閉線程池(不執(zhí)行隊(duì)列中的任務(wù),并嘗試中斷當(dāng)前執(zhí)行的任務(wù)) */ List<Runnable> shutdownNow(); /** * 判斷線程池是否處于shutdown狀態(tài). */ boolean isShutdown(); /** * 判斷線程池是否處于terminated狀態(tài). */ boolean isTerminated(); /** * 若在指定時(shí)間內(nèi)線程池處于terminated狀態(tài)則立即返回true,否則超過(guò)時(shí)間后仍未為terminated狀態(tài)則返回false. */ boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; /** * 向線程池提交一個(gè)任務(wù)并返回包含指定類型的Future(根據(jù)Callable的泛型) */ <T> Future<T> submit(Callable<T> task); /** * 向線程池提交一個(gè)任務(wù)并指定任務(wù)執(zhí)行結(jié)果的類型,返回包含指定類型的Future. */ <T> Future<T> submit(Runnable task, T result); /** * 向線程池提交一個(gè)任務(wù)并返回未知類型的Future. */ Future<?> submit(Runnable task); /** * 向線程池提交多個(gè)任務(wù)并返回指定類型的Future列表. */ <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; /** * 向線程池提交多個(gè)任務(wù)并返回指定類型的Future列表,如果在指定時(shí)間內(nèi)沒(méi)有執(zhí)行完畢則直接返回. */ <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; /** * 向線程池提交多個(gè)任務(wù),當(dāng)任意一個(gè)任務(wù)執(zhí)行完畢后返回指定類型的Future. */ <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; /** * 向線程池提交多個(gè)任務(wù),在指定時(shí)間內(nèi),當(dāng)任意一個(gè)任務(wù)執(zhí)行完畢后返回指定類型的Future,若超時(shí)則拋出異常. */ <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
public interface Future<V> { /** * 中斷任務(wù)的執(zhí)行 */ boolean cancel(boolean mayInterruptIfRunning); /** * 判斷任務(wù)是否中斷成功 */ boolean isCancelled(); /** * 判斷任務(wù)是否執(zhí)行完成 */ boolean isDone(); /** * 獲取任務(wù)的執(zhí)行結(jié)果直到任務(wù)執(zhí)行完畢(阻塞線程) */ V get() throws InterruptedException, ExecutionException; /** * 獲取任務(wù)的執(zhí)行結(jié)果,若在指定時(shí)間內(nèi)任務(wù)仍然沒(méi)有執(zhí)行完畢則拋出TimeoutException */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
*execute()方法不能獲取任務(wù)的執(zhí)行結(jié)果,而submit()方法能夠根據(jù)返回的Future實(shí)例獲取任務(wù)的執(zhí)行結(jié)果。
4.ThreadPoolExecutor
corePoolSize:線程池中核心線程的數(shù)量。
maximumPoolSize:線程池中最大線程數(shù)。
keepAliveTime:線程的空閑時(shí)間。
unit:修飾線程空閑時(shí)間的單位。
workQueue:任務(wù)隊(duì)列。
threadFactory:線程工廠,用于創(chuàng)建線程。
handler:當(dāng)隊(duì)列已滿且當(dāng)前線程數(shù)已達(dá)到所允許的最大值時(shí)的處理策略。
*線程池中的線程包括核心線程以及普通線程,核心線程一旦創(chuàng)建后直到線程池被關(guān)閉前都就不會(huì)被銷毀,而普通線程會(huì)因?yàn)榈竭_(dá)空閑時(shí)間而被銷毀。
構(gòu)造方法:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
BlockingQueue的類型
BlockingQueue提供了ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等實(shí)現(xiàn)類。
1.ArrayBlockingQueue:使用順序表的結(jié)構(gòu)進(jìn)行存儲(chǔ),在使用時(shí)需要指定其長(zhǎng)度,支持公平鎖/非公平鎖進(jìn)行操作。
2.LinkedBlockingQueue:使用鏈表的結(jié)構(gòu)進(jìn)行存儲(chǔ),在使用時(shí)不需要指定其長(zhǎng)度,隊(duì)列的最大長(zhǎng)度為Integer.MAX_VALUE。
3.SynchronousQueue:一個(gè)不存儲(chǔ)元素的隊(duì)列,每一個(gè)put操作必須等待take操作,否則不能添加元素,支持公平鎖和非公平鎖。
*這些實(shí)現(xiàn)類在進(jìn)行入隊(duì)和出隊(duì)操作時(shí)都會(huì)進(jìn)行加鎖,以保證在多線程并發(fā)訪問(wèn)時(shí)數(shù)據(jù)的安全性。
隊(duì)列已滿且線程數(shù)已達(dá)到所允許的最大值時(shí)的處理策略
RejectedExecutionHandler提供了AbortPolicy、DiscardPolicy、DiscardOlderstPolicy、CallerRunsPolicy四個(gè)策略,這四個(gè)策略都是ThreadPoolExecutor的靜態(tài)內(nèi)部類。
1.AbortPolicy:放棄任務(wù)并拋出RejectedExecutionException異常。
2.DiscardPolicy:放棄任務(wù)但不拋出異常。
3.DiscardOlderstPolicy: 放棄隊(duì)頭中的任務(wù),然后重新嘗試執(zhí)行新任務(wù)。
4.CallerRunsPolicy: 由調(diào)用線程來(lái)處理該任務(wù)。
線程池的狀態(tài)
private static final int RUNNING = -1; private static final int SHUTDOWN = 0; private static final int STOP = 1; private static final int TIDYING = 2; private static final int TERMINATED = 3;
1.RUNING:線程池處于運(yùn)行狀態(tài),此時(shí)可以接受新的任務(wù)請(qǐng)求,并且執(zhí)行隊(duì)列中的任務(wù)。
2.SHUTDOWN:線程池處于關(guān)閉狀態(tài),此時(shí)不接受新的任務(wù)請(qǐng)求,但會(huì)繼續(xù)執(zhí)行隊(duì)列中的任務(wù)。
3.STOP:線程池處于禁用狀態(tài),此時(shí)不接受新的任務(wù)請(qǐng)求,并且不會(huì)執(zhí)行隊(duì)列中的任務(wù)。
4.TIDYING:線程池處于整理狀態(tài),此時(shí)沒(méi)有正在執(zhí)行的任務(wù)。
5.TERMINATED :線程池處于終止?fàn)顟B(tài)。
線程池狀態(tài)的變化過(guò)程
1.當(dāng)線程池創(chuàng)建后處于RUNNING狀態(tài)。
2.1 若此時(shí)調(diào)用了shutdown()方法,那么線程池將處于SHUTDOWN狀態(tài),不接受新的任務(wù)請(qǐng)求,但會(huì)繼續(xù)執(zhí)行隊(duì)列中的任務(wù),當(dāng)隊(duì)列中的任務(wù)為空且沒(méi)有正在執(zhí)行的任務(wù)時(shí),線程池的狀態(tài)為T(mén)IDYING。
2.2 若此時(shí)調(diào)用了shutdownNow()方法,那么線程池將處于STOP狀態(tài),不接受新的任務(wù)請(qǐng)求并且不執(zhí)行隊(duì)列中的任務(wù),此時(shí)線程池的狀態(tài)為T(mén)IDYING。
3.當(dāng)線程池的狀態(tài)為T(mén)IDYING時(shí),當(dāng)terminated()方法處理完畢后,線程池的狀態(tài)為T(mén)RRMINATED。
任務(wù)的執(zhí)行流程
1.當(dāng)調(diào)用了execute()或者submit()方法向線程池提交一個(gè)任務(wù)后,首先判斷當(dāng)前線程池中的線程個(gè)數(shù)是否大于核心線程數(shù)。
2.如果當(dāng)前線程池的線程個(gè)數(shù)小于核心線程數(shù),則創(chuàng)建一個(gè)核心線程來(lái)處理任務(wù)。
3.如果當(dāng)前線程池的線程個(gè)數(shù)大于核心線程數(shù),則將任務(wù)放入到隊(duì)列中,如果放入隊(duì)列成功,那么該任務(wù)將等待被空閑的線程處理,如果放入隊(duì)列失敗(隊(duì)滿),則判斷當(dāng)前線程池中的線程個(gè)數(shù)是否達(dá)到所允許的最大值,若未達(dá)到則創(chuàng)建一個(gè)普通線程去處理任務(wù),否則根據(jù)預(yù)定義的處理策略去進(jìn)行處理。
5.Executors工具類
JAVA中提供了Executors工具類,用于直接創(chuàng)建Executor。
CacheThreadPool
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>()); }
CacheThreadPool創(chuàng)建的都是普通線程(其核心線程數(shù)為0)、線程池的最大線程數(shù)為Integer.MAX_VALUE、線程的空閑時(shí)間為60秒,此方式適合大量耗時(shí)短的任務(wù)、不適合大量耗時(shí)長(zhǎng)的任務(wù)。
*由于創(chuàng)建的都是普通線程,且空閑時(shí)間為60秒,則仍有可能會(huì)頻繁的創(chuàng)建線程。
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); }
FixedThreadPool創(chuàng)建的都是核心線程,其線程個(gè)數(shù)由入?yún)Q定,線程不會(huì)因?yàn)榭臻e時(shí)間而被銷毀,適合預(yù)知任務(wù)數(shù)量的業(yè)務(wù)。
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,new LinkedBlockingQueue<Runnable>())); }
SingleThreadExecutor使用一個(gè)核心線程來(lái)處理任務(wù)。
ScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
*ScheduledThreadPool支持定時(shí)執(zhí)行任務(wù)以及固定間隔執(zhí)行任務(wù)。
SingleThreadScheduledExecutor
public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1)); }
*SingleThreadScheduledExecutor支持一個(gè)線程的定時(shí)執(zhí)行任務(wù)以及固定間隔執(zhí)行任務(wù)。
public interface ScheduledExecutorService extends ExecutorService { /** * 在指定的延遲時(shí)間到達(dá)后執(zhí)行任務(wù)一次 */ public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit); /** * 在指定的延遲時(shí)間到達(dá)后執(zhí)行任務(wù)一次 */ public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit); /** * 在指定的初始化延遲時(shí)間到達(dá)后執(zhí)行任務(wù)一次,往后每隔period時(shí)間執(zhí)行任務(wù)一次. */ public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit); /** * 在指定的初始化延遲時(shí)間到達(dá)后執(zhí)行任務(wù)一次,往后每次任務(wù)執(zhí)行完畢后相隔delay時(shí)間執(zhí)行任務(wù)一次. */ public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit); }
WorkStealingPool
public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool(parallelism,ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true); }
WorkStealingPool創(chuàng)建一個(gè)并行級(jí)別的線程池,同一時(shí)刻最多只能有指定個(gè)數(shù)個(gè)線程正在執(zhí)行任務(wù),創(chuàng)建時(shí)直接指定同一時(shí)刻最多能允許的并行執(zhí)行的線程個(gè)數(shù)即可,如果不傳則使用CPU的核數(shù)。
newWorkStealingPool方法內(nèi)部返回一個(gè)ForkJoinPool實(shí)例,F(xiàn)orkJoinPool是JAVA7新提供的線程池,同樣繼承AbstactExecutorService。
*作用類似于Semaphore。
以上就是Java中線程池的作用有哪些,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(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)容。